2014-09-28 101 views
0

我正在使用Retrofit(1.7.1),它使用默認的OkHttp(2.1.0)客戶端(我猜)在服務器上進行身份驗證,並獲得一些會話Cookie來回復每個其他請求。如何在OkHttp中設置cookie格式?

我有一個CookieManager和一個設置「Cookie」標頭的攔截器。

攔截器構建的cookie作爲

cookieName + "=" + cookieValue + "; " 

(實際上我用一個StringWriter的,但結果它相同)

正確的頭的結果應該是:

Cookie: PHPSESSID=<my_php_sess_id>; session=<my_session_id>; 

默認實現(OkHttp我猜)添加另一個Cookie h EADER導致:

Cookie: PHPSESSID=<my_php_sess_id>; session=<my_session_id>; 
Cookie: $Version="1"; PHPSESSID="<my_php_sess_id>";$Path="/";$Domain="<my_domain>"; session="<my_session_id>";$Path="/";$Domain="<my_domain>" 

我能找到的第二報頭檢查僅使用Wireshark網絡的分組,所有的庫日誌僅示出了第一個。

我覺得這第二個標題會導致一些麻煩:請注意圍繞cookie值的引號。

有沒有辦法告訴OkHttp或Retrofit使用「普通」版本的cookie?
也許我誤解了所有的整個的Cookie /客戶機/攔截機制,但改造的客戶端設置爲:

.setClient(new ApacheClient(new DefaultHttpClient())) 

解決了這個問題。

預先感謝您

+0

您是否發現使用OkHttp而不是DefaultHttpClient的解決方案? – 2015-07-20 11:42:57

+0

我更新了包括2014年12月使用的Retrofit和OkHttp版本的問題。從那時起,我沒有再試過。你有更新版本的相同問題嗎? – Gnafu 2015-07-21 15:36:05

+0

我找到了一個解決辦法,強制cookie版本爲0.我會寫一個答案。 – 2015-07-22 08:56:35

回答

1

我也有類似的問題,造成其沒有處理版本1周的cookies(引用的值)一個網絡服務器。只有這樣,才能做到這一點,我發現是遍歷你的cookie存儲:

for (HttpCookie cookie: cookieStore.getCookies()) { 
    cookie.setVersion(0); 
}

但是......你需要調用這個每次一個cookie被改變。我寫了一個OkHttp攔截它正是這樣做的:

public class CookieBaker implements Interceptor { 
    private CookieStore cookieStore; 

    public CookieBaker(CookieStore cookieStore) { 
     this.cookieStore = cookieStore; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     for (HttpCookie cookie: cookieStore.getCookies()) { 
      cookie.setVersion(0); 
     } 

     Response response = chain.proceed(chain.request()); 

     for (HttpCookie cookie: cookieStore.getCookies()) { 
      cookie.setVersion(0); 
     } 

     return response; 
    } 
}

這就是你如何啓用它:

OkHttpClient httpClient = new OkHttpClient(); 
CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
httpClient.setCookieHandler(cookieManager); 
httpClient.interceptors().add(new CookieBaker(cookieManager.getCookieStore()));

我不使用設備的改進,但你應該像更換您的來電.setClient(new ApacheClient(new DefaultHttpClient())).setClient(httpClient)