web-dev-qa-db-ja.com

「Java.net.ProtocolException:サーバーのリダイレクト回数が多すぎます」エラーの取得

次のようなコードで簡単なURLリクエストを作成しています。

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

しかし、その最後の行では、「リダイレクトされた回数が多すぎます」というエラーが表示されます。たとえば、「webpage」変数がgoogle.comであれば正常に機能しますが、サーブレットのURLを使用しようとすると失敗します。私はこれでリダイレクトに従う回数を調整できるようです(デフォルトは20です):

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

しかし、たとえば100まで上げると、エラーをスローするのに間違いなく時間がかかるので、試行していることがわかります。ただし、私のサーブレットへのURLは(任意の)ブラウザーで正常に機能し、firebugの「persist」オプションを使用すると、1回だけリダイレクトされるようです。

私のサーブレットに関するもう少し情報...それはTomcatで実行されており、「mod-proxy-ajp」を使用してApacheが先頭に立ちます。また、フォーム認証を使用しているため、入力したURLがログインページにリダイレクトされる必要があります。私が言ったように、これはすべてのブラウザで正しく動作しますが、何らかの理由でJava 6のURLConnectionでリダイレクトが動作しません。

読んでくれてありがとう...アイデア?

31
rjcarr

ユーザーセッションを維持しないため、明らかに無限ループでリダイレクトされます。通常、セッションは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();
// ...

こちらもご覧ください:

44
BalusC

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));
5
Daniel Kennedy

私は同じ問題に直面していましたが、問題を理解するにはかなりの時間がかかりました。したがって、問題を要約すると、ヘッダーの不一致にあります。

以下が私のリソースであることを考慮してください

  @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);

そして、エラーはまさに上記の行に来ていました。

なにが問題だったの?

私のリソースは使用していました

「application/json」

@Producesアノテーション

私のクライアントは

accept( "application/boks-master-data + json")これが問題でした。

エラーはどこにも関連していないため、これを見つけるのに時間がかかりました。突破口は、郵便配達員のリソースにアクセスしようとしたときに

Accept-> "application/json"ヘッダー

それはうまくいきましたが、

Accept-> "application/boks-master-data + json"ヘッダーはありません。

繰り返しになりますが、Postmanでさえも適切なエラーを出してくれませんでした。エラーは一般的すぎました。参考として以下の画像をご覧ください。 Generic error message

1
Sanjay Bharwani

Unix環境のTomcat6でJenkinsを使用していて、このバグが発生しました。何らかの理由で、Java7にアップグレードすると解決しました。なぜそれが修正されたのかを正確に知りたいと思います。

1
user64141