2014-09-23 58 views
4

在我的android應用程序中,我正在遷移到okhttp,並且需要爲默認cookieStore中的登錄用戶手動設置PHPSESSID,以便它們不會得到登出。我使用下面的代碼手動設置cookie。在默認cookiestore中手動設置cookie並在okhttp請求中使用它

((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), new HttpCookie("PHPSESSID", getPhpSessionID())); 

該Cookie似乎是設置原因,我可以回去使用此代碼

((CookieManager)client.getCookieHandler()).getCookieStore().get(new URI("http://www.example.com")); 

然而,當我執行使用

Request request = new Request.Builder().url("http://www.example.com/getdata.php").build(); 
client.newCall(request).execute(); 

的cookies是客戶端調用拿到餅乾不在請求中發送(使用android代理驗證此網絡呼叫)。

什麼是正確的方式來設置這樣的cookie,以便okhttp客戶端使用該cookie?

+0

我有相同的問題,得到的答覆母鹿不幫我。你有沒有得到結果? – 2015-08-06 14:48:49

回答

6

似乎有成爲CookieHandlerput實施CookieManagerCookieStoreadd方法之間的差異。

默認情況下,如果您使用CookieManager中的put,那麼它將添加該域和實現在內部創建的HttpCookie的路徑。如果您直接使用CookieStore的add方法,則不會發生這種情況,因爲您是負責創建HttpCookie的人員。

事實證明,OkHttp使用get從你的情況將是CookieManager而不是CookieStore直接執行。那get也將使用path來匹配你的情況下將丟失的cookie。

如果您未向HttpCookie提供預期的默認路徑「/」,則不會找到您的cookie。

然後,您應該修改HttpCookie像這樣

HttpCookie cookie = new HttpCookie("PHPSESSID", getPhpSessionID()); 
cookie.setPath("/"); 
cookie.setVersion(0); 
cookie.setDomain("www.example.com"); 
((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), cookie); 

,或讓您的解決方案是在有機會更好地適應您更改CookieHandler實現,你可以使用接口而不是隻讓到CookieStore

訪問

你會做到這一點,像這樣

List<String> values = new ArrayList<>(Arrays.asList("PHPSESSID=" + "your_session_id_here")); 
Map<String, List<String>> cookies = new HashMap<>(); 
cookies.put("Set-Cookie", values); 
client.getCookieHandler().put(new URI("http://www.example.com"), cookies); 
+0

太好了。你的第二個解決方案奏效 但是第一個沒有。在這種情況下,okhttp在發送網絡請求時仍然拒絕設置cookie。 – Udbhav 2014-09-24 19:48:30

+0

我很高興至少有一個人工作。我很好奇爲什麼第一次沒有爲你做任何事情。 – 2014-09-24 20:03:21

+0

在您的第一個解決方案中,通過從域中刪除「http://」並添加'cookie.setDomain(「www.example.com」);' 而不是通常的Cookie, 'Cookie:PHPSESSID = fq01rjn8f8jgotrf7egvcf7mu4' 設置的值爲: 'Cookie:$ Version =「1」; PHPSESSID = 「fq01rjn8f8jgotrf7egvcf7mu4」; $ PATH = 「/」; $域= 「www.example.com」'。 服務器php文件無法將此cookie識別爲有效的sessionid cookie。 – Udbhav 2014-09-24 20:37:27

相關問題