Подтвердить что ты не робот

Получение "java.net.ProtocolException: перенаправление сервера слишком много раз" Ошибка

Я делаю простой запрос URL с кодом вроде этого:

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

Но в этой последней строке я получаю "перенаправленную слишком много раз ошибку". Если моя "веб-страница" var - это, скажем, google.com, тогда она работает нормально, но когда я пытаюсь использовать URL-адрес сервлета, она терпит неудачу. Кажется, я могу настроить количество раз, которое следует за перенаправлением (по умолчанию - 20):

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

Но когда я проворачиваю его, скажем, 100, определенно требуется больше времени, чтобы выбросить ошибку, поэтому я знаю, что она пытается. Тем не менее, URL-адрес моего сервлета отлично работает в любом браузере и использует опцию "persist" в firebug, кажется, что он перенаправляется только один раз.

Немного больше информации о моем сервлете... он работает в tomcat и работает с apache с помощью 'mod-proxy-ajp'. Также следует отметить, что используется аутентификация по форме, поэтому любой URL, который вы вводите, должен перенаправлять вас на страницу входа. Как я уже сказал, это корректно работает во всех браузерах, но по какой-то причине перенаправление не работает с URLConnection в Java 6.

Спасибо за чтение... идеи?

4b9b3361

Ответ 1

Он, по-видимому, перенаправляется в бесконечном цикле, потому что вы не поддерживаете сеанс пользователя. Сессия обычно поддерживается файлом 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();
// ...

См. также:

Ответ 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

Я использовал Jenkins на Tomcat6 в среде unix и получил эту ошибку. По какой-то причине обновление до 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"

в

@Поставляет аннотацию

и мой клиент использовал

принимает ( "приложение/Boks-мастер-данные +" ) JSON и это была проблема.

Мне потребовалось много времени, чтобы узнать об этом, поскольку ошибка не была связана с этим. Прорыв был, когда я попытался получить доступ к моему ресурсу в почтальоне с помощью

Accept- > "application/json" header

он работал нормально, однако

Accept- > "application/boks-master-data + json" header это не делает.

И снова даже Почтальон не дал мне правильной ошибки. Ошибка была слишком общей. Пожалуйста, ознакомьтесь с приведенным ниже изображением для справки. Общее сообщение об ошибке