Android WebView Cookie获取和设置,原生和H5同步token实现逻辑

转载请注明原创出处,谢谢!
  • GitHub: @Ricco

ps:
当我们实现原生app使用webView打开网页时候,然后h5网页有登录逻辑,会自动跳转到H5页面的登录页,但当用户已经在我们app登录过,这时候再让用户进行一次登录操作,是非常不友好的用户体验。

例如一个非常实现的业务,用户在打开app后会有一个活动弹窗,点击弹窗进入H5的活动落地页,但是活动这种业务需求,生命周期是非常短的,运营同学可能几天就换一种运营方式,抽奖、送优惠券、积分兑换等,实现逻辑不同,页面风格也不同,这种时候,如果我们的app一直频繁的发版,升级app版本是非常不友好的用户体验。而这种活动落地页面,始终伴随着用户信息,需要用户登录状态才可以正常参与。

这时候记录用户登录信息,下次打开H5页面,不需要重复登录这个需求,就十分重要了!!!

通常H5网页会从Cookie获取token,然后通过token来判断用户是否登录,所以如果我们可以将app的token传给H5,那就完美解决了问题。

实现方法有很多种,例如通过JS交互就可以,但是对于前端同学来说,这个改动的工程量非常大。所以这里我是推荐使用通过设置Cookie的方式实现,理论上前端同学是几乎不许要动任何代码的。

下面是给网页设置一个aaa=123456的cookie的例子

        // 保留cookies,而不是在随后的重新启动后清除
        CookieManager cookieManager = CookieManager.getInstance();
        // 允许接受 Cookie
        cookieManager.setAcceptCookie(true);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            // 跨域cookie读取
            cookieManager.setAcceptThirdPartyCookies(wv, true);
        }
        // 一定要给主域设置cookie,给子级地址设置,父级会无法获取到cookie值
        Log.i(TAG, "afterLoadLayout1: "+CookieManager.getInstance().getCookie("http://192.168.7.104:8080/"));
        Log.i(TAG, "afterLoadLayout2: "+CookieManager.getInstance().getCookie("http://192.168.7.104:8080/abc"));
        Log.i(TAG, "afterLoadLayout2: "+CookieManager.getInstance().getCookie("http://192.168.7.104:8080/abc/abc"));
        cookieManager.setCookie("http://192.168.7.104:8080/", "aaa=123456");
        // cookieManager.setCookie("http://192.168.7.104:8080/abc/abc", "aaa=123456");
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.getInstance().sync();
        } else {
            cookieManager.flush();
        }
        Log.i(TAG, "afterLoadLayoutA: "+CookieManager.getInstance().getCookie("http://192.168.7.104:8080/"));
        Log.i(TAG, "afterLoadLayoutB: "+CookieManager.getInstance().getCookie("http://192.168.7.104:8080/abc"));
        Log.i(TAG, "afterLoadLayoutB: "+CookieManager.getInstance().getCookie("http://192.168.7.104:8080/abc/abc"));
        // 配置 WebView
        WebSettings webSettings = wv.getSettings();
        // 开启DOM storage API 功能
        webSettings.setDomStorageEnabled(true);
        // 开启database storage API功能
        webSettings.setDatabaseEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setBlockNetworkImage(false);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

注意

  • WebSettings.setDomStorageEnabled(true); 前端网页才可以拿到值。


    H5代码.png
  • 一定要给主域设置cookie,给子级地址设置,父级地址会无法获取到cookie值
    例如我给http://www.xx.com/设置了cookie,也就是代码里的“aaa=123456”,http://www.xx.com/abc和http://www.xx.com/abc/abc是可以获取到的。
    但是我们给http://www.xx.com/abc/abc,这时候http://www.xx.com/abc和http://www.xx.com/没有办法获取到。
    (这个是我测出来的,我还没看懂底层的实现逻辑,为什么会出现这种情况,所以建议直接截取url的第一个斜杠就可以,我猜是path的原因)

  • 设置cookie后,可以在View->Tool Windows->Device File Explorer,找到dada/dada/包名/app_webview/Default/Cookies里找到(这是一个SQLite3文件,使用Navicat工具就可以打开)

使用Navicat打开Cookies表.png

你可能感兴趣的:(Android WebView Cookie获取和设置,原生和H5同步token实现逻辑)