Android http和WebView cookie同步

在Android中http请求的cookie是放在Header中的通过“Set-Cookie”来设置的,而WebView的cookie是在本地私有的数据库中保存着的,换句话说,这两个就是在不同的世界,但是对于cookie来说,又是通用的。问题来了,怎么让二者保持一致呢?

使用场景一:
如果APP处于登录状态,打开H5页面发现竟然还要再登录,这种情况是不是很尴尬!
使用场景二:
当你想统计做个活动会产生多少有效用户数据的时候,你会惊奇的发现,数据链在进入h5后就断掉了。

那么该如何解决这个问题呢?今天就来总结一下。

SETP1:需要有自己的一套管理cookie逻辑
管理cookie的事只有交给自己处理,才有可能让http请求和webView的cookie进行同步,具体实现略;

STEP2:如何从http请求中获取cookie?将cookie注入请求header中?
在此以第三方框架OKHTTP3.0为例

public class HttpCookieManager implements CookieJar {
   @Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
      //在此保存cookie
    }
    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
      //在此注入cookie
      return list;
    }
}

STEP3:如何从WebView中读取cookie?

public class MyWebViewClient extends WebViewClient {
  public void onPageFInish(WebView view, String url){
    CookieManager cookieManager = CookieManager.getInstance();
    String cookies = cookieManager.getCookie(url);
    //判断一下是否真的取到值
    String[] cookiesArray = cookies.split(";");
    //保存cookie
  }
}

STEP4:如何将cookie注入到webView中?

//在webView.loadUrl(url)之前调用此方法,否则无效
public void syncCookie(Context context, String url){
      CookieSyncManager.createInstance(context);
      CookieManager cookieManager = CookieManager.getInstance();
      cookieManager.setAcceptCookie(true);
      cookieManager.removeSessionCookie();
      List<Cookie> cookieList = HttpCookieManager.getInstance().loadForRequest(HttpUrl.parse(url));
      for(Cookie cookie : cookieList){
        //Tips:有多个cookie的时候必须设置多次,否则webView只读第一个cookie
        cookieManager.setCookie(url, cookie.toString());
      }
      cookieManager.setCookie(url, AccountManager.readUserCookie());
      CookieSyncManager.getInstance().sync();
}

总结

cookie同步是很有用的功能,也是日常企业很重要的需求,希望这篇文章对你有所帮助。

    原文作者:aitality
    原文地址: https://www.jianshu.com/p/6216e673a164
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞