webview和okhttp實(shí)現(xiàn)session共享

服務(wù)器端通過session來得知連接的客戶端,因此需要okhttp與webview使用一套cookie,就可以實(shí)現(xiàn)在H5頁(yè)面中與原生app同步登陸。
通過閱讀okhttp3源碼得知,Okhttp是使用cookjar來設(shè)置cookie的,而在OKHttpClient的Builfer方法中.默認(rèn)的cookjar是一個(gè)空的對(duì)象,沒有設(shè)置任何cookie

/** A cookie jar that never accepts any cookies. */
CookieJar NO_COOKIES = new CookieJar() {
@Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
}

@Override public List<Cookie> loadForRequest(HttpUrl url) {
  return Collections.emptyList();
}
};

所以只需要我們手動(dòng)取得webview的cookie并設(shè)置在okhttp的cookJar上即可實(shí)現(xiàn)cookie的共享。webview是的引擎為webkit,在webkit是有cookieManager對(duì)cookie進(jìn)行管理。

public class WebViewCookieHandler implements CookieJar {
private CookieManager mCookieManager = CookieManager.getInstance();

@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
    String urlString = url.toString();

    for (Cookie cookie : cookies) {
        mCookieManager.setCookie(urlString, cookie.toString());
    }
}

@Override
public List<Cookie> loadForRequest(HttpUrl url) {
    String urlString = url.toString();
    String cookiesString = mCookieManager.getCookie(urlString);

    if (cookiesString != null && !cookiesString.isEmpty()) {
        String[] cookieHeaders = cookiesString.split(";");
        List<Cookie> cookies = new ArrayList<>(cookieHeaders.length);

        for (String header : cookieHeaders) {
            cookies.add(Cookie.parse(url, header));
        }

        return cookies;
    }

    return Collections.emptyList();
  }
}

然后再創(chuàng)建okhttpclient的工具類中加上自定義的cookiejar

public static OKhttpClient getClient(){
      return new OkhttpClient.Builder()
                 .cookieJar(new WebViewCookieHandler())
                 .build();
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容