2010-11-12 14 views
40

puoi dirmi come memorizzare jsessionid in cookie, in modo che possa essere passato al servlet con richiesta post? Sto usando Apache HttpClient versione 4.0.3. Tutte le soluzioni che ho trovato spiega come farlo con HttpClient 3.1. Ho letto tutorial e ho provato questo, ma non funziona.Apache HttpClient 4.0.3 - Come faccio a impostare cookie con sessionID per la richiesta 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); 

Edit - ulteriori spiegazioni
sto collegano al servlet scritta da un amico. Ho effettuato l'accesso e ottenuto jsessionid. Ora voglio inviare un'altra richiesta e devo passare jsessionid a scopo di autorizzazione. Servlet funziona bene perché ho usato java HttpURLConnection, ho impostato il cookie, l'ho passato e ha funzionato. Ora con HttpClient non ottengo eccezioni ma il codice di ritorno dal servlet di friend indica che non c'era nessun sessionid nella richiesta.

Un'altra modifica: ho una soluzione Ho impostato il parametro dell'intestazione della richiesta e ha funzionato. Sessionid riconosciuto servlet.
httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId());

Ora la mia domanda è: questo metodo è corretto?

+0

Puoi dirci esattamente cosa non funziona? Ricevi un'eccezione o la richiesta viene inviata senza il cookie? Puoi fornire un dump del protocollo di rete? – ordnungswidrig

+0

Prova Fiddler http://www.fiddler2.com/fiddler2/ per vedere cosa sta succedendo esattamente. –

+0

Grazie mille! Sono riuscito a far riconoscere al mio server il cookie tramite: httppost.setHeader ("Cookie", "JSESSIONID =" + getSessionId()); – Zennichimaro

risposta

22

ho fatto passando il cookie attraverso il HttpContext:

HttpContext localContext = new BasicHttpContext(); 

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

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

Dovresti usare HttpClientContext invece di ClientContext che ora è contrassegnato come deprecato. – Bludwarf

38

Sono così felice per risolvere questo problema:

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

così facile!

+12

La chiave per me era impostare il dominio AND il percorso. Non passerebbe il cookie al server senza di esso. – christophercotton

+1

Ho passato molte volte a risolvere il problema con i cookie, il server non voleva accettare la mia richiesta, tuttavia gli strumenti firebug e chrome dev mostrano che tutti i parametri cookien tranne il valore sono vuoti. Solo quando ho impostato i valori del dominio e del percorso, la richiesta è stata positiva. Grazie. –

+1

Questo approccio è ora deprecato poiché AbstractHttpClient, che espone il metodo setCookieStore, è ora obsoleto a partire dalla versione 4.3. L'approccio di @ khai è ora il preferito. –

1

Probabilmente dovresti impostare tutte le proprietà dei cookie non solo il valore di esso. setPath(), setDomain() ... ecc

+0

Benvenuti in questo sito! Questa è una Q del 2010, con due risposte che hanno un sacco di voti positivi. Non sono sicuro che suggerimenti extra e imprecisi aiuterebbero chiunque. – joepd

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

non funziona a 4,5 versione senza

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

Ho trovato questa risposta anche in un altro argomento, in realtà, dovrebbe impostare il dominio. – CoolMind

+0

Questo 'cookie.setAttribute (ClientCookie.DOMAIN_ATTR," true ");' funziona davvero –

Problemi correlati