web-dev-qa-db-fra.com

Obtenir "Java.net.ProtocolException: le serveur a été redirigé trop de fois" Erreur

Je fais une simple requête d'URL avec un code comme celui-ci:

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

Mais sur cette dernière ligne, je reçois le message d'erreur "trop ​​de fois redirigé". Si ma variable "page Web" correspond, par exemple, à google.com, cela fonctionne correctement, mais lorsque j'essaie d'utiliser l'URL de mon servlet, elle échoue. Il semble que je puisse ajuster le nombre de fois qu'il suit les redirections (la valeur par défaut est 20) avec ceci:

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

Mais quand je le fais monter à, disons, 100, il faut définitivement plus de temps pour renvoyer l'erreur, alors je sais que c'est difficile. Cependant, l'URL de ma servlet fonctionne correctement dans (n'importe quel) navigateur et l'utilisation de l'option "persist" dans firebug ne semble être redirigée qu'une seule fois.

Un peu plus d'informations sur mon servlet ... il est exécuté dans Tomcat et présenté par Apache avec "mod-proxy-ajp". Il convient également de noter qu’il utilise l’authentification de formulaire, de sorte que toute URL que vous entrez doit vous rediriger vers la page de connexion. Comme je l'ai dit, cela fonctionne correctement dans tous les navigateurs, mais pour une raison quelconque, la redirection ne fonctionne pas avec l'URLConnection dans Java 6.

Merci d'avoir lu ... des idées?

30
rjcarr

Apparemment, il est redirigé dans une boucle infinie car vous ne conservez pas la session de l'utilisateur. La session est généralement accompagnée d'un cookie. Vous devez créer une CookieManager avant d'utiliser 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();
// ...

Voir également:

41
BalusC

Duse, j'ai ajouter ces lignes:

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

Voir cet exemple:

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

J'avais fait face au même problème et il avait fallu beaucoup de temps pour comprendre le problème… .. Donc, pour résumer, le problème résidait dans l'inadéquation des en-têtes.

Considérez ci-dessous comme ma 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
    }

Et voici le code client, qui essayait de se connecter à la ressource ci-dessus

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

Et l'erreur venait exactement au-dessus de la ligne.

Quel était le problème?

Ma ressource utilisait 

"application/json"

dans 

@Produces Annotation

et mon client utilisait 

accept ("application/boks-master-data + json") et c'était le problème.

Il m'a fallu longtemps pour découvrir cela, car l'erreur n'était liée à rien. Break through, c’est quand j’ai essayé d’accéder à ma ressource dans postman avec 

Accept-> "application/json" en-tête

cela a bien fonctionné, cependant avec

Accepter-> "application/boks-master-data + json" en-tête ça ne marche pas.

Et encore une fois, même Postman ne me donnait pas l'erreur appropriée. L'erreur était trop générique. S'il vous plaît voir l'image ci-dessous pour référence .  Generic error message

1
Sanjay Bharwani

J'utilisais Jenkins sur Tomcat6 sous un environnement Unix et j'ai eu ce bogue. Pour une raison quelconque, la mise à niveau vers Java7 l'a résolu. Je serais intéressé de savoir exactement pourquoi cela a résolu le problème.

1
user64141