2010-11-12 23 views
40

pouvez-vous me dire comment stocker jsessionid dans cookie, afin qu'il puisse être passé à la servlet avec demande de post? J'utilise Apache HttpClient version 4.0.3. Toutes les solutions que j'ai trouvées explique comment faire avec HttpClient 3.1. J'ai lu un tutoriel et essayé cela, mais cela ne fonctionne pas.Apache HttpClient 4.0.3 - comment paramétrer un cookie avec sessionID pour la requête POST

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); 

Modifier - explications supplémentaires
Je me connecte à servlets écrit par un ami. Je me suis connecté et j'ai obtenu jsessionid. Maintenant, je veux envoyer une autre requête et je dois passer jsessionid à des fins d'autorisation. Servlet fonctionne bien parce que j'ai utilisé java HttpURLConnection, définir le cookie, passé et cela a fonctionné. Maintenant avec HttpClient je n'obtiens aucune exception mais le code de retour du servlet d'ami indique qu'il n'y avait aucun ID de session dans la demande.

Autre modification - J'ai une solution J'ai défini le paramètre de l'en-tête de demande et cela a fonctionné. Servlet reconnu sessionid. Maintenant, ma question est la suivante: cette méthode est-elle correcte?

+0

Pourriez-vous nous dire ce qui ne fonctionne pas exactement? Avez-vous une exception ou la demande est-elle envoyée sans le cookie? Pouvez-vous fournir un vidage de protocole réseau? – ordnungswidrig

+0

Essayez Fiddler http://www.fiddler2.com/fiddler2/ pour voir ce qui se passe exactement. –

+0

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

Répondre

22

Je l'ai fait en faisant passer le cookie par l'intermédiaire HttpContext:

HttpContext localContext = new BasicHttpContext(); 

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

response = client.execute(httppost, localContext); 
+1

Vous devriez utiliser HttpClientContext au lieu de ClientContext qui est maintenant marqué comme obsolète. – Bludwarf

38

Je suis tellement 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); 

So Easy!

+12

La clé pour moi était de définir le domaine ET le chemin. Cela ne passerait pas le cookie au serveur sans cela. – christophercotton

+1

J'ai passé plusieurs fois pour résoudre le problème avec les cookies, le serveur ne voulait pas accepter ma demande, cependant les outils firebug et chrome dev montrent que tous les paramètres cookien sauf la valeur sont vides. Ce n'est que lorsque j'ai défini les valeurs de domaine et de chemin que la requête a été couronnée de succès. Je vous remercie. –

+1

Cette approche est maintenant obsolète car AbstractHttpClient, qui expose la méthode setCookieStore, est maintenant obsolète à partir de la version 4.3. L'approche de @ khai est maintenant la préférée. –

1

Vous devez probablement définir toutes les propriétés du cookie, pas seulement la valeur de celui-ci. setPath(), setDomain() ... etc

+0

Bienvenue sur ce site! C'est un Q de 2010, avec deux réponses qui ont un tas de upvotes. Je ne suis pas sûr si des conseils supplémentaires, imprécis aideraient n'importe qui. – joepd

8
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"); 
+0

J'ai également trouvé cette réponse dans un autre sujet, vraiment, il devrait définir un domaine. – CoolMind

+0

Cette 'cookie.setAttribute (ClientCookie.DOMAIN_ATTR," true ");' fonctionne vraiment –