关闭

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

标签: cookiewebviewcookie同步
17463人阅读 评论(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被拦截的问题。
10
0
查看评论

安卓学习笔记---AndroidWebview里设置Cookie遇到的坑

我们一般在使用WebView去加载H5界面的时候都会同步一下Cookie,一般的都会这么做: 在HttpClient中保存下来的Cookie怎么设置到WebView组件里,让WebView也保持住Cookie状态,也就是登录状态呢?  CookieSyncManager和CookieMa...
  • juhua2012
  • juhua2012
  • 2016-08-19 14:37
  • 11620

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

最近的项目中使用了H5页面和原生之间的交互,主要是原生通过js调用webview来加载H5页面,但是在进行通信时,涉及到一个cookie同步的问题,如果没处理好,真的是问题多多,纠结了好久,遇到了不少坑,今天在这里记录下: 首先是在网上找到很多地方都有的通用的webview同步cookie的方法如下...
  • you__are_my_sunshine
  • you__are_my_sunshine
  • 2017-02-17 11:54
  • 6163

原生登录cookie保持提供webview使用

  • 2016-04-11 16:35
  • 1.46MB
  • 下载

给WebView添加Cookie

一个很简单的问题,记下来备忘吧。 我们使用WebView加载网页的时候会出现这样的情况,就是我们直接加载网址是不行的,要想URL中添加Cookie(这个主要是用那个JSESSIONID,因为客户端和服务器端识别是同一会话的方法就是这个JSESSIONID),那我们应该怎么向URL添加呢? 给...
  • aa2116033
  • aa2116033
  • 2016-08-15 16:58
  • 2323

android webview cookie (遇到的坑,终极方案,解决你的疑惑)

说起来webview设置cookie很简单,但是我做的过程中参考网上的代码,发现还是没做对,最后摸索了好几天才摸索出来 希望能帮助有需要的人。 设置cookie方法 /** * 同步一下cookie * context:上下文 * url要访问的url */ pu...
  • w49019821
  • w49019821
  • 2017-07-24 14:52
  • 880

Android WebView访问网站携带登录认证Cookies和动态自定义的cookies

最近项目几个页面要复用微信程序的网页。但是需要调用微网站登录接口,返回Cookies,webview访问需要的网页的时候携带。 并且还需要几个其他的动态改变的cookie,目的是根据这几个动态自定义cookies来决定网页的内容。如果不传,则显示最原始的网页。 下面一步一步来记录: 第一步先调用微信...
  • geanwen
  • geanwen
  • 2017-03-19 11:24
  • 1385

在Android WebView中设置Cookie

package com.test.myapplication; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.webkit.CookieMa...
  • brook19
  • brook19
  • 2016-09-07 10:38
  • 4224

Android中webView加载H5绑定cookie

Android中webView加载H5绑定cookie 简介:          我最近在做项目的时候遇到了这种情况:1.需要用WebView实现一个H5的登陆注册。2.大赛报名,用H5实现。这些情况下,我需要把coo...
  • u010041075
  • u010041075
  • 2016-10-09 12:19
  • 3868

WebView 正确设置cookie 的方法

String url = "";//你想在webview显示的url,比如"http://www.baidu.com" CookieSyncManager.createInstance(context); CookieManager c...
  • rabbitinhere
  • rabbitinhere
  • 2015-11-13 18:15
  • 2708

Webview的Cookie和缓存处理

Webview的Cookie和缓存处理
  • catoop
  • catoop
  • 2015-07-11 16:08
  • 2193
    个人资料
    • 访问:1020987次
    • 积分:12302
    • 等级:
    • 排名:第1413名
    • 原创:181篇
    • 转载:4篇
    • 译文:0篇
    • 评论:228条
    这里有你需要的干货!!!
    关注我,获取推送O_o
    你需要的,才是干货@开源项目
    博客专栏
    最新评论