36

我正在使用如下代码发出一个简单的 URL 请求:

URL url = new URL(webpage);
URLConnection urlConnection = url.openConnection();
InputStream is = urlConnection.getInputStream();

但在最后一行,我得到“重定向太多次错误”。如果我的“网页”变量是 google.com,那么它可以正常工作,但是当我尝试使用我的 servlet 的 URL 时,它会失败。看来我可以调整它跟随重定向的次数(默认为 20):

System.setProperty("http.maxRedirects", "100");

但是当我把它提高到 100 时,抛出错误肯定需要更长的时间,所以我知道它正在尝试。但是,我的 servlet 的 URL 在(任何)浏览器中都可以正常工作,并且在 firebug 中使用“persist”选项似乎只重定向一次。

关于我的 servlet 的更多信息......它在 tomcat 中运行,并由 apache 使用'mod-proxy-ajp'。另外值得注意的是,它使用表单身份验证,因此您输入的任何 URL 都应将您重定向到登录页面。正如我所说,这在所有浏览器中都能正常工作,但由于某种原因,重定向不适用于 Java 6 中的 URLConnection。

感谢阅读……想法?

4

4 回答 4

50

它显然是在无限循环中重定向,因为您不维护用户会话。会话通常由 cookie 支持。您需要CookieManager在使用之前创建一个URLConnection.

// First set the default cookie manager.
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

// All the following subsequent URLConnections will use the same cookie manager.
URLConnection connection = new URL(url).openConnection();
// ...

connection = new URL(url).openConnection();
// ...

connection = new URL(url).openConnection();
// ...

也可以看看:

于 2012-06-14T15:56:46.530 回答
5

Duse,我添加了以下几行:

java.net.CookieManager cm = new java.net.CookieManager();
java.net.CookieHandler.setDefault(cm);

看这个例子:

java.net.CookieManager cm = new java.net.CookieManager();
java.net.CookieHandler.setDefault(cm);
String buf="";
dk = new DAKABrowser(input.getText());
try {
    URL url = new URL(dk.toURL(input.getText()));
    DataInputStream dis = new DataInputStream(url.openStream());
    String inputLine;
    while ((inputLine = dis.readLine()) != null) {
        buf+=inputLine;
        output.append(inputLine+"\n");
    }
    dis.close();
} 
catch (MalformedURLException me) {
    System.out.println("MalformedURLException: " + me);
}
catch (IOException ioe) {
    System.out.println("IOException: " + ioe);
}
titulo.setText(dk.getTitle(buf));
于 2013-02-20T22:29:57.630 回答
1

我在 unix 环境中的 Tomcat6 上使用 Jenkins 并得到了这个错误。出于某种原因,升级到 Java7 解决了它。我很想知道为什么会修复它。

于 2014-02-20T18:18:01.820 回答
0

我遇到了同样的问题,并且花了相当多的时间来理解这个问题。因此,总结问题在于标题不匹配。

考虑下面是我的资源

  @GET
  @Path("booksMasterData")
  @Produces(Array(core.MediaType.APPLICATION_JSON))
  def booksMasterData(@QueryParam("stockStatus") stockStatus : String): Response = {
 // some logic here to get the books and send it back
    }

这是客户端代码,它试图连接到我的上述资源

ClientResponse clientResponse = restClient.resource("http://localhost:8080/booksService").path("rest").path("catalogue").path("booksMasterData").accept("application/boks-master-data+json").get(ClientResponse.class);

并且错误正好在上面。

出了什么问题?

我的资源正在使用

“应用程序/json”

@Produces 注解

我的客户正在使用

accept("application/boks-master-data+json") 这就是问题所在。

我花了很长时间才发现这一点,因为错误与此无关。突破是当我尝试使用邮递员访问我的资源时

接受->“应用程序/json”标头

它工作得很好,但是

Accept-> "application/boks-master-data+json" 标头没有。

再一次,即使邮递员也没有给我正确的错误。这个错误太笼统了。请参阅下图以供参考。 通用错误消息

于 2017-02-10T13:05:58.647 回答