45 votes

Apache HttpClient 4.0.3 - Comment définir un cookie avec sessionID pour une requête POST ?

Pouvez-vous me dire comment stocker le jsessionid dans le cookie, afin qu'il puisse être transmis à la servlet avec la requête post ? J'utilise Apache HttpClient version 4.0.3. Toutes les solutions que j'ai trouvées expliquent comment faire cela avec HttpClient 3.1. J'ai lu le tutoriel et essayé, mais cela ne fonctionne pas.

HttpPost httppost = new HttpPost(postData);
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", getSessionId());
cookieStore.addCookie(cookie);
client.setCookieStore(cookieStore);
response = client.execute(httppost);

Editer - explications supplémentaires
Je me connecte à des servlets écrits par un ami. Je me suis connecté et j'ai obtenu jsessionid . Maintenant, je veux envoyer une autre requête et je dois passer le jsessionid à des fins d'autorisation. Le servlet fonctionne bien car j'ai utilisé java HttpURLConnection, défini le cookie, l'ai passé et cela a fonctionné. Maintenant, avec HttpClient, je n'obtiens aucune exception mais le code de retour de la servlet d'un ami indique qu'il n'y avait pas de sessionid dans la requête.

Une autre édition - J'ai une solution J'ai défini le paramètre de l'en-tête de la demande et cela a fonctionné. Le servlet a reconnu le sessionid.
httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId());

Ma question est la suivante : cette méthode est-elle correcte ?

0 votes

Pourriez-vous nous dire ce qui ne fonctionne pas exactement ? Obtenez-vous une exception ou la demande est-elle envoyée sans le cookie ? Pouvez-vous fournir un dump du protocole réseau ?

0 votes

Essayez Fiddler fiddler2.com/fiddler2 pour voir ce qui se passe exactement.

1 votes

Merci beaucoup ! J'ai réussi à faire reconnaître le cookie par mon serveur via : httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId()) ;

43voto

Keith Lee Points 141

Je suis si heureux de résoudre ce problème :

HttpPost httppost = new HttpPost(postData); 
CookieStore cookieStore = new BasicCookieStore(); 
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", getSessionId());

//cookie.setDomain("your domain");
cookie.setPath("/");

cookieStore.addCookie(cookie); 
client.setCookieStore(cookieStore); 
response = client.execute(httppost); 

Si facile !

13 votes

La clé pour moi était de définir le domaine ET le chemin. Sans cela, le cookie ne serait pas transmis au serveur.

1 votes

J'ai passé beaucoup de temps à résoudre le problème des cookies, le serveur ne voulait pas accepter ma demande, mais firebug et chrome dev tools montrent que tous les paramètres des cookies sauf la valeur sont vides. Ce n'est que lorsque j'ai défini les valeurs domain et path que la demande a été acceptée. Merci.

1 votes

Cette approche est désormais obsolète puisque AbstractHttpClient, qui expose la méthode setCookieStore, est désormais obsolète depuis la version 4.3. L'approche de @khai est désormais privilégiée.

23voto

khai Points 151

Je l'ai fait en passant le cookie par le HttpContext :

HttpContext localContext = new BasicHttpContext();

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

response = client.execute(httppost, localContext);

2 votes

Vous devriez utiliser HttpClientContext au lieu de ClientContext qui est maintenant marqué comme déprécié.

2 votes

Mise à jour du futur : pour le client http d'apache >=4.5, vous devez aussi este réponse.

11voto

liliya Points 141
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
response = client.execute(httppost, localContext);

ne fonctionne pas dans la version 4.5 sans

cookie.setDomain(".domain.com");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");

2voto

Vous devriez probablement définir toutes les propriétés du cookie et pas seulement sa valeur. setPath() , setDomain() ... etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X