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

标签: cookie webview cookie同步
19196人阅读 评论(1) 收藏 举报
分类:

在进行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)。
如图:
查看APP cookie
当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;
}

如图:
同步cookie

如果设置成功,通过cookieManager.getCookie(url)方法就可取得刚才设置的cookie,如果两次设置cookie的url相同,则CookieManager会将上一次设置的cookie覆盖,已达到更新的效果。
下面我们查看一下Cookie数据库中发生的变化。
如图:
查看WebView cookie
提示:
1. 同步cookie要在WebView加载url之前,否则WebView无法获得相应的cookie,也就无法通过验证。
2. 每次登录成功后都需要调用”syncCookie”方法将cookie同步到WebView中,同时也达到了更新WebView的cookie。如果登录后没有及时将cookie同步到WebView可能导致WebView拿的是旧的session id和服务器进行通信。

优点:

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

如何使用ASP进行打印操作

使用到的技术:ASP,WSH,VBScript文件ASPPrint.asp代码如下:      Option Explicit  Dim strSubmit        Form中用来保存提交按钮...
  • ghj1976
  • ghj1976
  • 2000-08-31 09:47:00
  • 1346

浅谈iOS中的WKWebView添加cookie

最近开发新功能,其中有加载网页的需求,而最近又了解到了WKWebView,说是耗内存小、加载速度快、与JS的交互好。因为需要与网页进行交互,而之前使用UIWebView发现与网页的交互并不是很好,于是...
  • u010105969
  • u010105969
  • 2016-12-30 14:53:22
  • 7214

IOS-WKWebView的使用以及Cookie的处理

其实和UIWebView的用法没什么区别,但是WKWebView相对于UIWebView强大了很多,内存的消耗相对少了,所提供的接口也丰富了。WKWebView的代理方法:WKNavigationDe...
  • Maxdong24
  • Maxdong24
  • 2016-11-15 10:08:50
  • 5333

iOS 获取 cookie webView中使用Cookie

【获取Cookie】 + (void)deleteCookie {     // 清空 cookie     NSHTTPCookieStorage *cookieJar = [NSHTTPC...
  • ifumu2011
  • ifumu2011
  • 2016-01-28 17:23:04
  • 2686

手动增加Cookie值(iOS端连接H5页面)

因为我们公司有H5端,也有ios端,当iOS端跳进H5端的时候,此时iOS端登录了,而H5端不能直接登录,这样就会造成用户困扰,即需要用户进行双登录,用户体验极为不好。因此我们准备在iOS端对H5的请...
  • u012701023
  • u012701023
  • 2017-07-11 16:42:18
  • 388

iOS UIWebView 通过 cookie 完成自动登录验证

一些说明: 通过UIWebView登录后,会自动得到web服务器设置的cookie包括服务器中的seesionid。cookie不会自动保存在app里面,需要通过设置才能在下次启动app时获...
  • assholeu
  • assholeu
  • 2014-08-17 18:42:27
  • 15991

NT_iOS笔记—webview添加Cookie

webView添加cookie
  • NT_Tian
  • NT_Tian
  • 2015-09-21 16:44:53
  • 3156

安卓中原生与H5(webview)之间交互时cookie的同步

最近的项目中使用了H5页面和原生之间的交互,主要是原生通过js调用webview来加载H5页面,但是在进行通信时,涉及到一个cookie同步的问题,如果没处理好,真的是问题多多,纠结了好久,遇到了不少...
  • you__are_my_sunshine
  • you__are_my_sunshine
  • 2017-02-17 11:54:25
  • 8197

android 加载webview时,保存并同步cookie实现免登陆

1.首先当加载完webview的时候,我们得获取到webview上设置的cookie信息,代码如下; @Override public void onPageFinishe...
  • zhouyang19910320
  • zhouyang19910320
  • 2015-09-18 14:34:31
  • 3324

Android同步Cookie到WebView

1,本处用的是Volley网络请求框架,在网络请求成功回调之后有返回cookie值过来这个时候在Volley的回调方法 @Override protected Response parseN...
  • dodan
  • dodan
  • 2016-09-13 00:27:24
  • 4149
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 107万+
    积分: 1万+
    排名: 1384
    你需要的,才是干货@开源项目
    博客专栏
    最新评论