作者:Nedo_zou | 来源:互联网 | 2023-09-05 15:38
在进行APP+H5混合开发的时候,一些功能是用native方法实现的,如登陆,一些功能是用H5实现的。所以往往需要将在native方法登陆的状态同步到H5中避免再次登陆。这种情况在Android开
在进行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(){}
})
缺点:
- 兼容性差,多数浏览器为了安全起见,都做了禁止修改请求中的COOKIE的限制。比如iOS的WebView会拦截ajax修改的COOKIE。
- 繁琐,每次请求都需要拼接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 COOKIESyncManager.createInstance(context);
}
COOKIEManager COOKIEManager = COOKIEManager.getInstance();
COOKIEManager.setCOOKIE(url, 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和服务器进行通信。
优点:
- 方便,只需要在登陆后将COOKIE同步到WebView即可,省去了每次请求都需要设置一次的繁琐。
- 兼容性好,因为是系统原生支持的,所以兼容性自然比方式一要好,不存在COOKIE被拦截的问题。