J'ai une application Java (JDK 1.7.0_13) et j'utilise Java.net.HttpURLConnection pour me connecter à certains services basés sur des servlets qui gèrent les sessions. J'essaie de comprendre comment utiliser Java .net.CookieManager pour suivre les cookies de session. En lisant les documents, j'ai l'impression que l'installation de CookieManager avec CookieHandler.setDefault (nouveau CookieManager ()) devrait entraîner la gestion automatique des cookies. Cependant, plusieurs demandes adressées aux mêmes URL ne semblent pas préserver cookies. Dois-je extraire manuellement les cookies des réponses et les renvoyer dans les demandes par moi-même ou est-ce que CookieManager va le faire automatiquement pour moi? Si CookieManager ne le fait pas, alors quelle valeur ajoute-t-il?
Pour tester les choses, j'ai un servlet qui incrémente avec succès un compteur chaque fois que mon navigateur visite une URL. Cela fonctionne très bien avec Safari, FireFox et Chrome ... Cependant, je ne peux pas le faire fonctionner à partir d'une application autonome Java.
Voici un programme de test très simple pour illustrer ce que j'espérais être un travail simple. Il installe le CookieManager au début puis appelle une méthode fetch (String urlString) à plusieurs reprises au fur et à mesure que les URL sont saisies sur la console.
package com.brilliant.experimental;
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.net.CookieHandler;
import Java.net.CookieManager;
import Java.net.HttpURLConnection;
import Java.net.URL;
public class HttpFetcher {
public static void fetch(String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
int status = conn.getResponseCode();
System.out.println("Status = " + status);
String key;
System.out.println("Headers-------start-----");
for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
System.out.println(key + ":" + conn.getHeaderField(i));
}
System.out.println("Headers-------end-----");
System.out.println("Content-------start-----");
String inputLine;
while ((inputLine = reader.readLine()) != null) {
System.out.println(inputLine);
}
System.out.println("Content-------end-----");
in.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
CookieHandler.setDefault(new CookieManager());
for (int i = 0; i < args.length; i++) {
fetch(args[i]);
}
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);
String Prompt = "> ";
String urlString;
try {
for (System.out.print(Prompt);
(urlString = reader.readLine()) != null;
System.out.print(Prompt))
{
fetch(urlString);
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
}
Invoquer ma servlet depuis cette application récupère clairement un cookie de session du serveur. Cependant, une nouvelle invocation obtient un nouveau cookie de session.
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:31 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:33 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
Donc, pour résumer, dois-je faire autre chose pour que CookieManager fonctionne automatiquement pour moi, ou dois-je recourir à l'extraction manuelle des cookies des réponses et à leur renvoi avec des demandes?
J'exécute votre code et le remplace
CookieHandler.setDefault(new CookieManager());
par
CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );
Ça marche!