2010-11-12 167 views
40

你能告訴我如何將jsessionid存儲在cookie中,因此它可以通過post請求傳遞給servlet嗎?我正在使用Apache HttpClient版本4.0.3。 我發現的所有解決方案都解釋瞭如何使用HttpClient 3.1完成此操作。 我讀過教程,並試過這個,但它不工作。Apache HttpClient 4.0.3 - 如何爲POST請求設置cookie和sessionID

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

編輯 - 進一步解釋
我連接到由朋友寫的servlet。我已經登錄並獲得jsessionid。現在我想發送另一個請求,並且需要傳遞jsessionid以進行授權。 Servlet工作正常,因爲我使用java HttpURLConnection,設置cookie,通過它,它工作。現在使用HttpClient,我沒有得到任何異常,但來自friend的servlet的返回碼指示請求中沒有sessionid。

另一個編輯 - 我有一個解決方案 我設置請求標題的參數,它的工作。 Servlet識別的sessionid。
httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId());

現在我的問題是:這種方法是否正確?

+0

你能告訴我們究竟是不行的工作?您是否收到異常或請求是否在沒有cookie的情況下發送?你能提供網絡協議轉儲嗎? – ordnungswidrig 2010-11-12 15:38:11

+0

嘗試提琴手http://www.fiddler2.com/fiddler2/看看究竟發生了什麼。 – 2010-11-12 15:59:02

+0

非常感謝! 我設法讓我的服務器通過以下方式識別cookie: httppost.setHeader(「Cookie」,「JSESSIONID =」+ getSessionId()); – Zennichimaro 2012-09-28 09:06:29

回答

22

我做到了通過將餅乾通過的HttpContext:

HttpContext localContext = new BasicHttpContext(); 

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

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

你應該使用HttpClientContext而不是ClientContext,它現在被標記爲棄用。 – Bludwarf 2015-10-30 16:19:06

38

我很高興來解決這個問題:

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

那麼容易!

+12

我的關鍵是設置域和路徑。沒有它,它不會將cookie傳遞給服務器。 – christophercotton 2012-05-23 15:56:48

+1

我花了很多時間來解決cookies問題,服務器並不想接受我的請求,但是firebug和chrome dev工具顯示除了value之外的所有cookien參數都是空的。只有當我設置域和路徑值時,請求才能成功。謝謝。 – 2013-06-19 13:53:37

+1

由於AbstractHttpClient(公開了setCookieStore方法)現在已被棄用,現在已從版本4.3開始棄用。 @ khai的方法現在是首選方法。 – 2015-03-11 15:35:47

1

您應該設置所有的cookie屬性,而不僅僅是它的值。 setPath()setDomain() ......等

+0

歡迎來到本網站!這是2010年的一個Q,有兩個答案,有一堆upvotes。我不確定額外的不準確的提示是否會幫助任何人。 – joepd 2015-12-16 23:14:12

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

不會在4.5版本,而

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

我也在另一個主題中發現了這個答案,真的,它應該設置域。 – CoolMind 2016-06-03 14:56:40

+0

這個'cookie.setAttribute(ClientCookie.DOMAIN_ATTR,「true」);'真的有效 – 2017-07-28 18:08:38

相關問題