【WebView】Android WebView中的Cookie操作
Hybrid App(混合式应用)的开发过程中少不了与WebView的交互,在涉及到账户体系的产品中,包含了一种登录状态的传递。比如,在Native(原生)界面的登录操作,进入到Web界面时,涉及到账户信息时,需要将登录状态传递到Web里面,避免用户二次登录。这里就涉及到WebView加载网页时的Cookie操作了。
通常我们在登录时获取到用户的Cookie和Token信息,然后将其保存到sdcard的WebView缓存文件当中,这样在加载网页时,WebView会自动将当前url的本地Cookie信息放在http请求的request中,传递给服务器。
流程如下:
1、Android客户端给WebView设置Cookie的代码如下:
public boolean syncCookie() {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, "website_name="+spManager.getLong(CSJSharedPreferencesManager.KEY_USER_ID));
cookieManager.setCookie(url, "website_token="+"294539a5631280a2cdbf99f0e906dc21");
String newCookie = cookieManager.getCookie(url);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context);
cookieSyncManager.sync();
}
return TextUtils.isEmpty(newCookie) ? false : true;
}
注意事项:
1. Cookie设置必须放在WevSettings设置和webView.loadUrl()方法之前;
2. 当Cookie包含了多个键值对信息时,需要多次调用setCookie方法,而不是使用下面这种添加分号的形式拼接字符串:
- website_name=782; website_token=8f47c21816cb596c93b97d64adb7eb9b; JSESSIONID=4315103E6AB51DE5BA3D910772735D1C; website_name=782; website_token=294539a5631280a2cdbf99f0e906dc21;
3. 在API 21之后,WebView实现了自动同步Cookie,不需要手动同步,所以,使用时可以添加版本判断;
4. 实际使用过程中,我在展示Web的Activity中通过多次调用setCookie的方法设置Cookie,通过Native界面多次进入Web页面,发现loadUrl时,Cookie值存在重复,比如:
第一次进入Web:
- website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1
第二次进入Web:
- website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1; JSESSIONID=4C17030F8E622F18DCDDA8B58EE7AB3D; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; website_name=782
出现问题:Set-Value存在重复,这样导致,如果切换账号进入Web,会出现数据错乱的情景,所以,如果采用在展示Web的Activity中设置Cookie的方式,需在onDestroy方法中清除Cookie。
5. 可以使用WebSetting添加userAgent,方便前端网页判断请求来源,如:
- WebSettings settings = webView.getSettings();
- String ua = settings.getUserAgentString();
- settings.setUserAgentString(ua + "; android_app/1.0.0");
2、CookieManager会将这个Cookie存入该应用程序/data/data/databases/目录下的webviewCookiesChromium.db数据库的cookies表中
3、打开网页,WebView从数据库中读取该cookie值,放到http请求的头部,传递到服务器
4、客户端可以在注销登录时清除该应用程序用到的所有cookies,避免切换账号等操作情景产生缓存问题。
- cookieManager.removeAllCookie();
补充:WebView获取加载网页的cookie:
private class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webview.loadUrl(url);
return true;
}
public void onPageFinished(WebView view, String url) {
CookieManager cookieManager = CookieManager.getInstance();
String CookieStr = cookieManager.getCookie(url);
super.onPageFinished(view, url);
}
}
关于Http Cookie的信息参考地址:
http://www.cnblogs.com/hdtianfu/archive/2013/05/30/3108295.html
【WebView】Android WebView中的Cookie操作的更多相关文章
- jquery中的cookie操作
使用前在页面中引入下面的代码 /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Cop ...
- js中的cookie操作
一.js cookie 使用时把此段代码引入页面 (function (factory) { if (typeof define === 'function' && define. ...
- Javascript中的Cookie操作
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Android 系统中运行jar文件
在android系统中运行jar操作步骤: 1. 打包编译jar包 2. 将jar包导入android设备中 adb push test.jar /data/local/tm ...
- django系列7.2--django中的cookie和session基本操作,浏览器登陆验证的不同实现
django中的cookie和session(02)–操作 一.Django中的cookie操作 ctrl + shift + del 是谷歌浏览器中清除页面缓存和cookie的快捷键 1.设置coo ...
- Android webview 写入cookie的解决方法以及一些属性设置
原文地址:https://www.2cto.com/kf/201703/616868.html Android webview 写入cookie的解决方法以及一些属性设置,webview怎么设置写入C ...
- Android WebView与JavaScript交互操作(Demo)
应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http:// ...
- Android WebView保存Cookie登录
因项目需要,需要在App中嵌入网页,使用Nativie方式登录,然后将cookie保存到WebView中,实现免登录功能.同步Cookie到WebView的方法网上有大量的参考资料,也可以参考下面的代 ...
- Android WebView中那些不得不解决的坑~~
前面那张hybrid开发心得 有人问 怎么解决不用onJsPrompt 来回调js函数的问题.其实很简单,就是在在你的jscalljava回调函数内 另外开个线程去load js代码即可: wb.po ...
随机推荐
- jumpserver 安装
# CentOS 7 安装jumpserver $ setenforce 0 # 可以设置配置文件永久关闭$ systemctl stop iptables.service$ systemctl st ...
- ES 大批量写入提高性能的策略
1.用bulk批量写入 你如果要往es里面灌入数据的话,那么根据你的业务场景来,如果你的业务场景可以支持让你将一批数据聚合起来,一次性写入es,那么就尽量采用bulk的方式,每次批量写个几百条这样子. ...
- Kubernetes 学习14 kubernetes statefulset
一.概述 1.在应用程序中我们有两类,一种是有状态一种是无状态.此前一直演示的是deployment管理的应用,比如nginx或者我们自己定义的myapp它们都属于无状态应用. 2.而对于有状态应用, ...
- asp.net+ tinymce粘贴word
公司做的项目需要用到粘贴Word功能.就是将word内容一键粘贴到网页编辑器(在线富文本编辑器)中.Chrome+IE默认支持粘贴剪切板中的图片,但是我要粘贴的文章存在word里面,图片多达数十张,我 ...
- Intel 80286 CPU
一.80286概述 INTEL 1982年推出80286芯片,该芯片相比8086和8088有了飞跃式发展,虽然它仍是16位结构,但在CPU内部含有13.4万个晶体管,时钟频率由最初6MHz逐步提高到2 ...
- linux共享文件 - samba 服务器
1.Samba 服务器 客户端 yum 安装: # yum install samba samba-client -y 2.samba 配置文件配置 /etc/samba/smb.conf [glo ...
- RS码的突发纠错能力
RS码便于纠突发错误.所谓突发错误,是指burst errors. 即一长串连续位出错.例如 0011XXXX1010. 其中X表示出错.如果是GF(2^4)中定义的RS码,则可以由一个符号错误纠正. ...
- jmeter五种提取器 之 正则表达式
提取器的作用是把响应结果值获取到,用于后续的请求参数中 () :封装了待返回的匹配字符串. . :匹配任何单个字符串. + :一次或多次. ? :不要太贪婪,在找到第一个匹配项后停止. * :匹配 ...
- mac Understand 安装破解
下载:链接:https://pan.baidu.com/s/1UvxgFnjv9pRVJmZO-J2OrQ 密码:nyd4 启动后,开始激活,点击enter License code 点击“use ...
- FCS省选模拟赛 Day4
传送门 Solution Code /* 斯坦纳树:O(n*3^n+kE*2^n) 暂且把O(k*E)当成是spfa的复杂度 15:15~16:20 原题:bzoj_4774 */ #include ...