需求描述:
将app登陆接口返回的TGC信息写入webview的cookie当中
技术名词
CAS、Cookie、TGC
解决方案
我们都知道okhttp的CookieJar接口为我们获取网络请求过程中cookie信息提供了方法。android里面的CookieManager是用来给WebView提供原生管理cookie的办法的。这里我们我们打通上述问题的关键就是使用CookieManager来实现原生方法中登陆返回的cookie写入CookieManager中来达到WebView可以直接使用写入的cookie信息,避免在webview中二次登陆
引入:
Cookie 什么是cookie:最简单理解就是由http衍生出来的一种特殊的浏览器的缓存,特点是具有时效性、账户相关性、存储在客户端等。
作用:作为客户端的用户认证的通行证,比如服务端可以通过cookie来区分到底是哪个用户。
Android 中Cookie的管理相关:说到cookie的管理,其实本质上就是数据的存储问题。在早期的cookie是由CookieSyncManager进行管理的,但是在API 21 之后CookieSyncManager被抛弃了,换成了CookieManager来进行管理。
Android中Cookie的存储:项目中使用 WebView 其实会自动将 Cookie 保存在本地数据库中。保存是路径为 data/data/package_name/app_WebView/Cookies 虽然不是 .db 结尾的,实际就是一个 .db 文件
CookieSyncManager 使用CookieSyncManager同步cookie数据:在早期手机硬件性能比较尴尬的时候,为了提升浏览器的性能,加快cookie的读写,浏览器的cookie是存储在手机的内存上的。但是,当当存储在内存上是不够的,还需要保存到存储器上,这时CookieSyncManager应运而生。借助于CookieSyncManager在内存和存储器之间同步浏览器的cookie。另外CookieSyncManager同步策略是在一个独立的线程里定时进行同步。
cookie开始同步:注意每次同步的时间间隔是5分钟
//推荐在Activity.onResume()里调用
CookieSyncManager.createInstance(context); CookieSyncManager.getInstance().startSync();
cookie停止同步:
// Activity.onPause()里调用
CookieSyncManager.getInstance().stopSync()
cookie立即同步:调用了该方法会立即进行cookie的同步,代码如下:
// 一般是在webview中的onPageFinished(WebView, String)方法进行强制同步 CookieSyncManager.getInstance().sync() 删除cookie操作:
//通常删除cookie的是这样写的
CookieSyncManager.createInstance(this);
CookieManager.getInstance().removeAllCookie(); CookieManager.getInstance().removeSessionCookie(); CookieSyncManager.getInstance().sync();
CookieSyncManager.getInstance().startSync();
CookieManager
使用CookieManager管理cookie:从API 21之后,WebView 已经内置了cookie的同步操作了。
手动设置cookie:
HttpCookie cookie = new HttpCookie(name, value); cookie.setDomain(""); // 设置域名 cookie.setPath("/"); // 设置path cookie.setMaxAge(233); // 设置过期时间
// 调用CookieManager 的方法设置cookie // 具有相同的 host 和 path 和 name 的任何现有的 Cookie 将会被替换为新的 Cookie CookieManager.getInstance().setCookie(url, cookie.toString());
注:只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
Android 5.0以上的手机使用原生WebView浏览网页,在进行登录的时候会提示验证码错误,通过查找5.0以上系统的api文档,发现5.0以上版本的webview做了较大的改动,如:同步cookie的操作已经可以自动进行,但前提是我们必须开启第三方cookie的支持,
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().setAcceptThirdPartyCookies(webView,true); } 删除cookie操作:底层实现是异步清除数据库的记录
//非常简洁 CookieManager.getInstance().removeAllCookies(null); CookieManager.getInstance().flush(); 立即同步:注意到这个flush()方法就是立即同步cookie的操作,与CookieSyncManager中的sync()方法是一样的
通过了解引入内容我们可以知道,CookieManager的主要作用就是帮助我们Cookie持久化,这样我们的一些状态就可以保持了,不至于一推出应用就又要重新登陆。另外也为我们可以更好的控制和管理cookie里面的信息。
注意点
1.CookieManager的废弃方法,以及替代方法,新方法解决了那些问题? 2.各个子系统的域名都不一,如何写入TGC才能使得其他子系统也处于登陆状态? 3.子系统退出登陆应用又该作出怎样的反应?
我们将会在okhttp与webview同步cookie(下)进行具体的代码讲解