获取“java.net.ProtocolException:服务器重定向次数太多”错误

时间:2012-06-13 20:38:30

标签: java url servlets redirect urlconnection

我正在使用以下代码制作简单的网址请求:

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

但是在最后一行,我得到了“重定向太多次错误”。如果我的“网页”var是google.com,那么它可以正常工作,但是当我尝试使用我的servlet的URL时,它就失败了。我似乎可以通过以下方式调整重定向后的次数(默认为20):

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

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

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

感谢阅读...想法?

4 个答案:

答案 0 :(得分:43)

由于您不维护用户会话,因此显然会在无限循环中重定向。会话通常由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();
// ...

另见:

答案 1 :(得分: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));

答案 2 :(得分:1)

我在unix环境中使用Jenkins on Tomcat6并得到了这个bug。出于某种原因,升级到Java7解决了它。我有兴趣知道为什么修复它。

答案 3 :(得分:1)

我遇到了同样的问题,花了相当多的时间来理解这个问题。 总而言之,问题在于标题不匹配。

考虑下面是我的资源

  @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"

in

  

@Produces annotation

我的客户正在使用

  

接受("应用/伯克主数据+ JSON&#34)   这就是问题所在。

我花了很长时间才发现这一点,因为错误与此无关。突破是当我尝试使用

访问邮递员中的资源时
  

接受 - > "应用/ JSON"头

它工作正常,但是

  

接受 - > "应用/伯克主数据+ JSON"头   它没有。

再一次,甚至Postman都没有给我正确的错误。错误过于笼统。请参阅下图以供参考。 Generic error message