1

J'ai eu une situation frustrante où un code java que j'avais écrit pour automatiser certaines actions sur un site web a cessé de fonctionner après que le site soit passé en https. Je ne pouvais plus me connecter correctement. Au lieu de cela, je finirais par obtenir un résultat de 200 avec l'échec de connexion.Pourquoi mes appels Java HttpsURLConnection ne fonctionnent pas et les cookies sont-ils perdus?

Je ne pouvais pas comprendre pourquoi il semblait ignorer les données de connexion que j'ai envoyées, et ne pas me rendre les cookies pour m'identifier lors d'appels ultérieurs.

Je réponds à ma propre question ici parce que j'ai finalement compris ce qui se passait et j'espère que cela pourrait aider les autres (et mon avenir).

Répondre

1

La principale raison de mon problème est que le site a renvoyé un résultat 302 avec des cookies appropriés, mais je n'ai jamais eu l'occasion de l'interpréter.

Le comportement par défaut du HttpURLConnection consiste à suivre les redirections pour moi. Cela aurait été dandy si elle a également conservé les cookies à leur retour de la première demande, mais ce n'est pas le cas. Cela a provoqué le serveur à recevoir la redirection vers le site approprié, mais perdre ses cookies montrant mon login était bon.

Pour résoudre ce problème juste besoin de cet appel au début de mon programme:

HttpURLConnection.setFollowRedirects(false); 

qui permettent 302 par mon obtenir vu du code qui pourrait alors recueillir les valeurs de cookie et soumettre à nouveau une demande à la nouvelle Location. Je ne sais pas si c'est un bug que la redirection suivante a ignoré les valeurs d'en-tête Set-Cookie, mais si cela aurait dû ou pas, cela m'a certainement perturbé pendant un moment.

Une autre question est que le site je parfois envoyé une valeur Location qui était relative plutôt qu'absolue, donc je devais gérer cela avec le code comme ceci:

if (!location.startsWith("http")) { 
    String newLocation = url.getProtocol() + "://" + url.getHost(); 
    if (url.getPort() > 0) { 
     newLocation += ":" + url.getPort(); 
    } 
    if (location.startsWith("/")) { 
     newLocation += location; 
    } 
    else { 
     if (!location.startsWith("/")) { 
      location = "/" + location; 
     } 
     newLocation += url.getPath() + location; 
    } 
    location = newLocation; 
} 
url = new URL(location); 

Cela se fait dans une boucle qui continue d'essayer de nouvelles valeurs d'URL pendant que 302 revient sans cesse.