OKhttp3中的cookies
OkHttpClient client = new OkHttpClient().newBuilder().cookieJar(new CookieJar() { private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url.host(), cookies); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url.host()); return cookies != null ? cookies : new ArrayList<Cookie>(); } }).build();主要就是實現CookieJar接口,在OkHttpClient構建的時候。
OkHttp3 默認不保持 Cookie 的解決方案
OkHttp3 聲明的 OkHttpClient 默認不保存 Cookie,不發送 Cookie。在實際開發中會丟失 Session ID 造成服務器無法判斷當前用戶的登錄狀態。查閱多方資料后給出解決辦法。
三點概念:
首次與服務器建立連接時,服務器生成 SessionID 標記當前連接會話。(HTTP 是無連接協議)
客戶端 request 時,將 帶有 SessionID 的 Cookie 發送至服務器,以此作為會話標記。
在實際使用 OkHttp3 時,通常一個 Application 只使用 一個 OkHttpClient 實例進行連接。
解決方案:
構建 CookieJar 對象,并重寫 saveFromResponse 和 loadFromRequest 方法。
使用構建了 CookieJar 的 OkHttpClient 實例收發 Http 連接。
本程序中使用了單例模式構造 OkHttpClient 實例,Cookie 持久化代碼如下:
mOkHttpClient = new OkHttpClient.Builder() .cookieJar(new CookieJar() { private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url.host(), cookies); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url.host()); return cookies != null ? cookies : new ArrayList<Cookie>(); } }).build();總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答