it-swarm.com.de

Fehler beim Abrufen von "Java.net.ProtocolException: Server wurde zu oft umgeleitet"

Ich mache eine einfache URL-Anfrage mit folgendem Code:

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

Aber in dieser letzten Zeile bekomme ich den Fehler "zu viele Male umgeleitet". Wenn meine "webpage" -Variable beispielsweise google.com ist, funktioniert es einwandfrei, aber wenn ich versuche, die URL meines Servlets zu verwenden, schlägt dies fehl. Anscheinend kann ich die Anzahl der Umleitungen (die Standardeinstellung ist 20) folgendermaßen einstellen:

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

Aber wenn ich es auf etwa 100 hoch drehe, dauert es definitiv länger, den Fehler zu werfen, also weiß ich, dass es versucht. Die URL zu meinem Servlet funktioniert jedoch in (jedem) Browser. Wenn Sie die Option "persist" in Firebug verwenden, scheint die Weiterleitung nur einmal zu erfolgen.

Noch ein paar Infos zu meinem Servlet ... es läuft in Tomcat und wird von Apache mit 'mod-proxy-ajp' angezeigt. Außerdem wird die Formularauthentifizierung verwendet, sodass Sie von jeder URL, die Sie eingeben, zur Anmeldeseite umgeleitet werden sollen. Wie gesagt, das funktioniert in allen Browsern korrekt, aber aus irgendeinem Grund funktioniert die Umleitung nicht mit der URLConnection in Java 6.

Danke fürs Lesen ... Ideen?

30
rjcarr

Anscheinend wird in einer Endlosschleife umgeleitet, weil Sie die Benutzersitzung nicht aufrechterhalten. Die Sitzung wird normalerweise von einem Cookie unterstützt. Sie müssen eine CookieManager erstellen, bevor Sie URLConnection verwenden.

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

Siehe auch:

41
BalusC

Duse, ich habe folgende Zeilen hinzugefügt:

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

Siehe dieses Beispiel:

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

Ich war mit dem gleichen Problem konfrontiert und es hat lange gedauert, bis ich das Problem verstanden habe.

Betrachten Sie unten meine Ressource

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

Und hier ist der Client-Code, der versucht, eine Verbindung zu meiner obigen Ressource herzustellen

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

Und der Fehler kam genau über der Linie.

Was war das Problem?

Meine Ressource hat verwendet 

"Anwendung/Json"

im 

@Produces-Anmerkung

und mein Kunde benutzte 

accept ("application/boks-master-data + json") und das war das problem.

Ich habe lange gebraucht, um das herauszufinden, da der Fehler nicht im Zusammenhang stand. Durchbruch war, als ich versuchte, auf meine Ressource beim Postboten mit zuzugreifen 

Accept-> "application/json" Header

es hat aber gut funktioniert

Accept-> "application/boks-master-data + json" Header es tut nicht.

Und selbst der Postman gab mir keinen richtigen Fehler. Der Fehler war zu allgemein. Bitte sehen Sie das Bild unten als Referenz .  Generic error message

1
Sanjay Bharwani

Ich habe Jenkins auf Tomcat6 in einer Unix-Umgebung verwendet und diesen Fehler erhalten. Aus irgendeinem Grund wurde das Upgrade auf Java7 behoben. Ich würde gerne wissen, warum das Problem behoben wurde.

1
user64141