获取“java.net.ProtocolException: Server redirected too too times”错误

2022-09-01 03:51:14

我正在用这样的代码做一个简单的URL请求:

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中运行,并由apache使用“mod-proxy-ajp”进行。同样值得注意的是,它使用表单身份验证,因此您输入的任何URL都应将您重定向到登录页面。正如我所说,这在所有浏览器中都正常工作,但由于某种原因,重定向不适用于Java 6中的URLConnection。

感谢您的阅读...想法?


答案 1

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

// 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();
// ...

另请参阅:


答案 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));