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