次のようなコードで簡単な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でリダイレクトが動作しません。
読んでくれてありがとう...アイデア?
ユーザーセッションを維持しないため、明らかに無限ループでリダイレクトされます。通常、セッションは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();
// ...
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));
私は同じ問題に直面していましたが、問題を理解するにはかなりの時間がかかりました。したがって、問題を要約すると、ヘッダーの不一致にあります。
以下が私のリソースであることを考慮してください
@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でさえも適切なエラーを出してくれませんでした。エラーは一般的すぎました。参考として以下の画像をご覧ください。
Unix環境のTomcat6でJenkinsを使用していて、このバグが発生しました。何らかの理由で、Java7にアップグレードすると解決しました。なぜそれが修正されたのかを正確に知りたいと思います。