获取“java.net.ProtocolException:服务器重定向太多次”错误
Posted
技术标签:
【中文标题】获取“java.net.ProtocolException:服务器重定向太多次”错误【英文标题】:Getting "java.net.ProtocolException: Server redirected too many times" Error 【发布时间】:2012-06-16 21:16:11 【问题描述】:我正在使用如下代码发出一个简单的 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。
感谢阅读...想法?
【问题讨论】:
您是在给自己打电话并指挥自己的电话吗?例如无限回避? 您可以尝试在禁用 cookie 的浏览器中打开此页面吗? 我把它当作网页!=(包含URL url = new URL(webpage); URLConnection urlConnection = url.openConnection(); InputStream is = urlConnection.getInputStream();
的servlet URL)
jonnyGold:你的意思是本地主机还是什么?不,网址是外部的;萨米:不知道你在问什么; dbf:宾果游戏!就是这样,谢谢!
很高兴你得到了它,我们只是确保你的脚本不会一次又一次地调用自己,但我很高兴你让它正常工作。
【参考方案1】:
它显然是在无限循环中重定向,因为您不维护用户会话。会话通常由 cookie 支持。在使用URLConnection
之前,您需要创建一个CookieManager
。
// 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();
// ...
另见:
Using java.net.URLConnection to fire and handle HTTP requests【讨论】:
正如 dbf 在 cmets 中所说,问题确实与 cookie 有关。您在此处发布的内容本质上是我使用的解决方案,因此我将其标记为已接受的答案。希望我可以为 dbf 提供帮助。 :)【参考方案2】: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));
【讨论】:
【参考方案3】:我在 unix 环境中的 Tomcat6 上使用 Jenkins 并遇到了这个错误。出于某种原因,升级到 Java7 解决了它。我很想知道为什么会修复它。
【讨论】:
【参考方案4】:我也遇到过同样的问题,并且花了相当长的时间来理解这个问题。 所以总结一下问题是标题不匹配。
考虑以下是我的资源
@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”
在
@产生注解
我的客户正在使用
accept("application/boks-master-data+json") 这就是问题所在。
我花了很长时间才发现这一点,因为错误与此无关。突破是当我尝试使用
在邮递员中访问我的资源时Accept-> "application/json" 标头
它工作得很好,但是
Accept-> "application/boks-master-data+json" 标头 它没有。
再一次,即使是邮递员也没有给我正确的错误。这个错误太笼统了。请参阅下图以供参考。
【讨论】:
以上是关于获取“java.net.ProtocolException:服务器重定向太多次”错误的主要内容,如果未能解决你的问题,请参考以下文章