服務(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();
}