Primim „java.net.ProtocolException: Server redirecționat de prea multe ori” Eroare (Programare, Java, Url, Servlets, Redirecționare, Urlconnection)

rjcarr a intrebat.

Fac o cerere URL simplă cu un cod de genul acesta:

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

Dar pe ultima linie, primesc eroarea „redirecționat de prea multe ori”. Dacă var-ul meu „pagina web” este, să zicem, google.com, atunci funcționează bine, dar când încerc să folosesc URL-ul servletului meu, atunci eșuează. Se pare că pot ajusta numărul de ori de câte ori urmează redirecționările (implicit este 20) cu acest lucru:

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

Dar atunci când îl ridic la, să zicem, 100, cu siguranță durează mai mult timp până când apare eroarea, așa că știu că încearcă. Cu toate acestea, URL-ul către servlet-ul meu funcționează bine în (orice) browser și, folosind opțiunea „persist” din firebug, se pare că se redirecționează doar o singură dată.

Câteva informații suplimentare despre servlet-ul meu … acesta rulează în Tomcat și este gestionat de Apache folosind ‘mod-proxy-ajp’. De asemenea, de reținut, utilizează autentificarea prin formular, astfel încât orice URL pe care îl introduceți ar trebui să vă redirecționeze către pagina de autentificare. După cum am spus, acest lucru funcționează corect în toate browserele, dar, din anumite motive, redirecționarea nu funcționează cu URLConnection în Java 6.

Vă mulțumesc pentru lectură … idei?

Comentarii

  • Vă apelați pe dvs. însuși și direcționați acest apel în sine? De exemplu, Recucerirea infinită? –  > Por bluevector.
  • Ați putea încerca să deschideți această pagină în browser cu cookie-urile dezactivate? –  > Por dbf.
  • Să înțeleg că pagina web != (URL-ul servletului care conține URL url = new URL(webpage); URLConnection urlConnection = url.openConnection(); InputStream is = urlConnection.getInputStream();) –  > Por Samy Vilar.
  • jonnyGold: vrei să spui localhost sau ceva de genul? nu, url-ul este extern; samy: nu sunt sigur ce întrebi; dbf: bingo! asta este, mulțumesc! –  > Por rjcarr.
  • Mă bucur că ai reușit, ne asiguram doar că scriptul tău nu se apela singur din nou și din nou, dar mă bucur că ai reușit să funcționeze. –  > Por Samy Vilar.
4 răspunsuri
BalusC

Se pare că se redirecționează într-o buclă infinită pentru că nu menții sesiunea utilizatorului. Sesiunea este de obicei susținută de un cookie. Trebuie să creați un fișier CookieManager înainte de a utiliza 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();
// ...

Vedeți și:

  • Utilizarea java.net.URLConnection pentru a lansa și gestiona cereri HTTP

Comentarii

  • După cum a spus dbf în comentarii, problema era într-adevăr legată de cookie-uri. Ceea ce ai postat aici este în esență soluția pe care am folosit-o eu, așa că voi marca acest răspuns ca fiind acceptat. Mi-aș dori să-i pot oferi un ajutor lui dbf. 🙂 –  > Por rjcarr.
Daniel Kennedy

Duse, am adăugat aceste linii:

java.net.CookieManager cm = new java.net.CookieManager();
java.net.CookieHandler.setDefault(cm);

Vezi acest exemplu:

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+"
");
    }
    dis.close();
} 
catch (MalformedURLException me) {
    System.out.println("MalformedURLException: " + me);
}
catch (IOException ioe) {
    System.out.println("IOException: " + ioe);
}
titulo.setText(dk.getTitle(buf));

user64141

Am folosit Jenkins pe Tomcat6 într-un mediu unix și am primit acest bug. Din anumite motive, actualizarea la Java7 a rezolvat-o. Aș fi interesat să știu exact de ce anume a rezolvat-o.

Sanjay Bharwani

M-am confruntat cu aceeași problemă și mi-a luat o cantitate considerabilă de timp pentru a înțelege problema.Deci, pentru a rezuma, problema a fost în nepotrivirea antetelor.

Luați în considerare mai jos fiind resursa mea

  @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
    }

Și aici este codul clientului, care încerca să se conecteze la resursa mea de mai sus

ClientResponse clientResponse = restClient.resource("http://localhost:8080/booksService").path("rest").path("catalogue").path("booksMasterData").accept("application/boks-master-data+json").get(ClientResponse.class);

Iar eroarea apărea exact pe linia de mai sus.

Care era problema?

Resursa mea folosea

„application/json”

în

adnotarea @Produces

iar clientul meu folosea

accept(„application/boks-master-data+json”) și aceasta era problema.

Mi-a luat mult timp să aflu acest lucru, deoarece eroarea nu avea nicio legătură. Am reușit când am încercat să accesez resursa mea în postman cu

Accept-> „application/json” header

a funcționat bine, însă cu

Accept-> „application/boks-master-data+json” nu funcționează.

Și, din nou, nici Postman nu mi-a dat o eroare corespunzătoare. Eroarea era prea generică. Vă rugăm să vedeți imaginea de mai jos ca referință.