【WebView的cookie机制 】轻松搞定WebView cookie同步问题

在进行APP+H5混合开发的时候,一些功能是用native方法实现的,如登陆,一些功能是用H5实现的。所以往往需要将在native方法登陆的状态同步到H5中避免再次登陆。这种情况在Android开发中比较常见,因为Android不会自动同步cookie到WebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步。本文将会介绍两种cookie同步的方式,并重点分析WebView的cookie机制。在开始之前先讲一下基于session的登录验证。 基于session的登录验证: 基于session的登录验证,会在程序请求接口的时候判断服务器端是否有当前会话的session,如果没有则被认为没有登录。客户端没有session这一概念,但有cookie与其对应。每一个session都有一个session id作为唯一标识。在登录成功后服务器会在请求头中返回cookie,cookie包含着这次登录会话的session id,在接下来的请求中只需要将登陆返回的cookie设置到请求头中便可以通过验证。

方式一:客户端将cookie传给H5

如何做:

  • 客户端:将登陆时从服务器取得的cookie传给html。
  • html:ajax从参数中取出客户端传来的cookie,ajax发请求时将客户端传来cookie设置到请求头中。

ajax修改cookie的方式

$.ajax({
   headers: {'Cookie' : document.cookie },
   url: "sub.domain.com",
   success: function(){}
})

缺点:

  1. 兼容性差,多数浏览器为了安全起见,都做了禁止修改请求中的cookie的限制。比如iOS的WebView会拦截ajax修改的cookie。
  2. 繁琐,每次请求都需要拼接cookie作为参数,比较繁琐。

方式二:将cookie同步到WebView(推荐)

原理分析:

WebView的cookie机制

WebView是基于webkit内核的UI控件,相当于一个浏览器客户端。它会在本地维护每次会话的cookie(保存在data/data/package_name/app_WebView/Cookies.db)。 如图:

当WebView加载URL的时候,WebView会从本地读取该URL对应的cookie,并携带该cookie与服务器进行通信。 WebView通过android.webkit.CookieManager类来维护cookie。CookieManager是WebView的cookie管理类。

如何做:

下面我们就通过CookieManager将cookie同步到WebView中。 之前同步cookie需要用到CookieSyncManager类,现在这个类已经被deprecated。如今WebView已经可以在需要的时候自动同步cookie了,所以不再需要创建CookieSyncManager类的对象来进行强制性的同步cookie了。现在只需要获得 CookieManager的对象将cookie设置进去就可以了。

第一步:登录时从服务器的返回头中取出cookie 根据Http请求的客户端不同,取cookie的方式也不同,我就不一一罗列了,需要的网友可以自行Google,以HttpURLcollection为例: String cookieStr = conn.getHeaderField("Set-Cookie"); 第二步:将cookie同步到WebView中

/**
 * 将cookie同步到WebView
 * @param url WebView要加载的url
 * @param cookie 要同步的cookie
 * @return true 同步cookie成功,false同步cookie失败
 * @Author JPH
 */
public static boolean syncCookie(String url,String cookie) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
		CookieSyncManager.createInstance(context);
	}
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可
    String newCookie = cookieManager.getCookie(url);
    return TextUtils.isEmpty(newCookie)?false:true;
}

如图:

如果设置成功,通过 cookieManager.getCookie(url)方法就可取得刚才设置的cookie,如果两次设置cookie的url相同,则CookieManager会将上一次设置的cookie覆盖,已达到更新的效果。 下面我们查看一下Cookie数据库中发生的变化。 如图:

提示:

  1. 同步cookie要在WebView加载url之前,否则WebView无法获得相应的cookie,也就无法通过验证。
  2. 每次登录成功后都需要调用”syncCookie”方法将cookie同步到WebView中,同时也达到了更新WebView的cookie。如果登录后没有及时将cookie同步到WebView可能导致WebView拿的是旧的session id和服务器进行通信。

优点:

  1. 方便,只需要在登陆后将cookie同步到WebView即可,省去了每次请求都需要设置一次的繁琐。
  2. 兼容性好,因为是系统原生支持的,所以兼容性自然比方式一要好,不存在cookie被拦截的问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CreateAMind

ros rviz 滴滴数据可视化

https://aws.amazon.com/cn/premiumsupport/knowledge-center/connect-to-linux-deskt...

1832
来自专栏北京马哥教育

10 个最不流行的 Linux 命令

英文:Tecmint,编译:Linux中国/Luoxcat linux.cn/article-2265-1.html 在本文中,我们将关注几个不为人知的Lin...

3607
来自专栏Python专栏

用python来更改小伙伴的windows开机密码,不给10块不给开机

2816
来自专栏進无尽的文章

扒虫篇-Bug日志 Ⅲ

解决方法:可能是由于粘贴网页上的代码的时候两行之间的回车引起的,有未识别的回车或者换行,找到,删除掉就 OK了。

1472
来自专栏琯琯博客

开发 Composer 包详细步骤

一、GitHub 创建一个名 uploadfile 新仓库,并克隆至本地。 二、初始化项目,生成composer.json文件 2.1 步骤 2.2 步骤解释...

76512
来自专栏魏艾斯博客www.vpsss.net

解决 WordPress 插件更新“需要访问您网页服务器权限”的问题

3456
来自专栏散尽浮华

Centos6.X 下安装并使用VNC的操作记录

VNC是一个的"远程桌面"工具。,通常用于“图形界面”的方式登录服务器,可视化操作。废话不多说了,操作记录如下: 1)安装桌面环境 [root@vm01 ~]#...

3707
来自专栏源码之家

无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装

2508
来自专栏Play & Scala 技术分享

【长期更新】Play-Java开发技巧问答

2974
来自专栏JavaEdge

Shiro实战(五) - 会话管理

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器Tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件...

4063

扫码关注云+社区

领取腾讯云代金券