首先cookie是什麼就很少說了,仍是不知道的話推薦看看這篇文章
Cookie/Session機制詳解
深刻解析Cookie技術html
爲何要持久化cookie也很少說了,你能看到這篇文章表明你有這個需求。git
cookie簡單來講就是服務器在客戶端中保存的鍵值對,好比說早期的購物車,保持登錄狀態都是使用的cookie。
可是cookie的功能是依賴於瀏覽器的,大多數瀏覽器都有管理cookie的功能。固然,你也能經過設置禁止掉這項功能,畢竟cookie是很容易泄露用戶隱私的github
上面也說了cookie功能依賴於客戶端,很明顯,在開發app的時候咱們也要手動管理cookie了。web
持久化cookie以前,咱們最好了解一下cookie是怎麼傳輸的,看完以後我想你就能使用很簡單的方式去保持cookie了。
Cookie使用HTTPHeader傳遞數據。
Cookie機制定義了兩種報頭:Set-Cookie報頭和Cookie報頭。segmentfault
Set-Cookie報頭包含於Web服務器的響應頭(ResponseHeader)中
Cookie報頭包含在瀏覽器客戶端請求頭(ReguestHeader)中瀏覽器
Cookie的運行過程如圖所示,具體分析以下
服務器
方法來源於這http://tsuharesu.com/handling-cookies-with-okhttp/cookie
看了cookie的傳輸原理以後咱們就能夠用一個簡單的方式持久化cookie了,那就是經過okhttp的intercept方式手動往header中寫入cookie或者獲取cookie。app
/** * This interceptor put all the Cookies in Preferences in the Request. * Your implementation on how to get the Preferences MAY VARY. * <p> * Created by tsuharesu on 4/1/15. */ public class AddCookiesInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request.Builder builder = chain.request().newBuilder(); HashSet<String> preferences = (HashSet) Preferences.getDefaultPreferences().getStringSet(Preferences.PREF_COOKIES, new HashSet<>()); for (String cookie : preferences) { builder.addHeader("Cookie", cookie); Log.v("OkHttp", "Adding Header: " + cookie); // This is done so I know which headers are being added; this interceptor is used after the normal logging of OkHttp } return chain.proceed(builder.build()); } }
/** * This Interceptor add all received Cookies to the app DefaultPreferences. * Your implementation on how to save the Cookies on the Preferences MAY VARY. * <p> * Created by tsuharesu on 4/1/15. */ public class ReceivedCookiesInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); if (!originalResponse.headers("Set-Cookie").isEmpty()) { HashSet<String> cookies = new HashSet<>(); for (String header : originalResponse.headers("Set-Cookie")) { cookies.add(header); } Preferences.getDefaultPreferences().edit() .putStringSet(Preferences.PREF_COOKIES, cookies) .apply(); } return originalResponse; } }
/** * Somewhere you create a new OkHttpClient and use it on all your requests. */ OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(new AddCookiesInterceptor()); okHttpClient.interceptors().add(new ReceivedCookiesInterceptor());
簡單的cookie持久化能夠用這種方式,建立一個單例的client,全局都使用這個client請求接口。固然你也能夠每次new一個client從新設置intercept……ide
還要記住的是,cookie是針對於域名存儲的。好比:www.baidu.com和image.baidu.com存儲的cookies都是不同的……
若是你的app真的須要同時訪問兩個域名的接口,而且兩個都須要持久化cookie,那麼記得作判斷(好比用域名做爲key存儲cookie到sharepreference中)。不然兩個域名的cookie會互相覆蓋掉……
相關原理能夠看看這篇文章 OkHttp3之Cookies管理及持久化
而後,持久化管理cookie能夠直接使用這個開源庫,簡單到爆炸……
https://github.com/franmontiel/PersistentCookieJar
固然,你也可使用鴻洋大神的okhttputils,該庫也提供了cookie的持久化管理工具。用起來和上面同樣方便