【WebView】Android WebView中的Cookie操作

转载 2016年08月31日 12:32:23

Hybrid App(混合式应用)的开发过程中少不了与WebView的交互,在涉及到账户体系的产品中,包含了一种登录状态的传递。比如,在Native(原生)界面的登录操作,进入到Web界面时,涉及到账户信息时,需要将登录状态传递到Web里面,避免用户二次登录。这里就涉及到WebView加载网页时的Cookie操作了。


通常我们在登录时获取到用户的Cookie和Token信息,然后将其保存到sdcard的WebView缓存文件当中,这样在加载网页时,WebView会自动将当前url的本地Cookie信息放在http请求的request中,传递给服务器。


流程如下:

1、Android客户端给WebView设置Cookie的代码如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public boolean syncCookie() {  
  2.     CookieManager cookieManager = CookieManager.getInstance();  
  3.     cookieManager.setCookie(url, "website_name="+spManager.getLong(CSJSharedPreferencesManager.KEY_USER_ID));  
  4.     cookieManager.setCookie(url, "website_token="+"294539a5631280a2cdbf99f0e906dc21");  
  5.     String newCookie = cookieManager.getCookie(url);  
  6.     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {  
  7.         CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context);  
  8.         cookieSyncManager.sync();  
  9.     }  
  10.     return TextUtils.isEmpty(newCookie) ? false : true;  
  11. }  

注意事项:

1. Cookie设置必须放在WevSettings设置和webView.loadUrl()方法之前;

2. 当Cookie包含了多个键值对信息时,需要多次调用setCookie方法,而不是使用下面这种添加分号的形式拼接字符串:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 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:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1  
第二次进入Web:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 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,方便前端网页判断请求来源,如:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. WebSettings settings = webView.getSettings();  
  2. String ua = settings.getUserAgentString();  
  3. settings.setUserAgentString(ua + "; android_app/1.0.0");  


2、CookieManager会将这个Cookie存入该应用程序/data/data/databases/目录下的webviewCookiesChromium.db数据库的cookies表中

3、打开网页,WebView从数据库中读取该cookie值,放到http请求的头部,传递到服务器

4、客户端可以在注销登录时清除该应用程序用到的所有cookies,避免切换账号等操作情景产生缓存问题。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. cookieManager.removeAllCookie();  


补充:WebView获取加载网页的cookie:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private class MyWebViewClient extends WebViewClient {  
  2.   
  3.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  4.             webview.loadUrl(url);  
  5.             return true;  
  6.         }  
  7.   
  8.         public void onPageFinished(WebView view, String url) {  
  9.             CookieManager cookieManager = CookieManager.getInstance();  
  10.             String CookieStr = cookieManager.getCookie(url);  
  11.             super.onPageFinished(view, url);  
  12.         }  
  13.   
  14.     }  


关于Http Cookie的信息参考地址:

http://www.cnblogs.com/hdtianfu/archive/2013/05/30/3108295.html



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

我们一般在使用WebView去加载H5界面的时候都会同步一下Cookie,一般的都会这么做: 在HttpClient中保存下来的Cookie怎么设置到WebView组件里,让WebView也保持住Co...
  • juhua2012
  • juhua2012
  • 2016年08月19日 14:37
  • 10891

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

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

webView中设置cookie无效

webView中设置cookie无效 最近用webView里面要同步Cookies,但是只同步url了,所以在此页面请求其他服务的接口时候,cookie就没有同步成功。这是为啥呢 还原问题打开 h...
  • gyh790005156
  • gyh790005156
  • 2016年11月09日 16:31
  • 1815

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

最近项目几个页面要复用微信程序的网页。但是需要调用微网站登录接口,返回Cookies,webview访问需要的网页的时候携带。 并且还需要几个其他的动态改变的cookie,目的是根据这几个动态自定义c...
  • geanwen
  • geanwen
  • 2017年03月19日 11:24
  • 1192

在Android的WebView中给一级域名设置cookie

在手机上有时候访问网页,需要app传递用户的信息,需要用到cookie。大多数人都知道是调用cookieManager.setCookie(url, value), 但不知道怎么讲一级域名的cooki...
  • owillll
  • owillll
  • 2014年03月07日 16:16
  • 7284

Android Cookie共享到WebView避免再次登录(保持登录状态)

最近在做项目时用到了webview打开指定链接的网页,可已经把webview设置了cookie但始终跳转到登录页面,这明显是cookie没有设置成功导致webview没有将设置好的cookie发送出去...
  • u014593566
  • u014593566
  • 2017年11月30日 18:54
  • 43

android中Webview设置多个cookie参数

有时候需要在cookie中设置多个参数传递给前端页面,常用的是 token和渠道号 。将N个参数的key-value按照分号分开然后一次设置,一直只使用token第一个参数,可以正常获取,所以没问题,...
  • HKlsijun
  • HKlsijun
  • 2017年11月01日 10:48
  • 105

Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie

最近做项目在手机端登录Http请求和 WebView 记载登录获取Cookie信息,可转码查看信息。 Http请求获取Cookie信息: public static String request(...
  • DickyQie
  • DickyQie
  • 2017年01月07日 11:15
  • 2178

关于webview保存cookie问题

问题描述: 最近项目上需要使用webview加载一个邮件功能,登陆时候会获取一个邮件登陆的地址,第一次打开没有问题,第二次打开就提示“cookie not matched”开始采取的措施是每次打开U...
  • hu1tian2long3
  • hu1tian2long3
  • 2016年11月28日 16:19
  • 803

Android开发——webview获取H5的Cookie并保存在本地

最近项目遇到一个新需求,H5的登录态跟APP的登录态分开,所以需要记住H5的登录状态,但是我的webview app已退出再次打开,cookie就被清空(这个找了很久也没会找到原因)。我的解决方法是...
  • u013704970
  • u013704970
  • 2016年12月19日 10:26
  • 3449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【WebView】Android WebView中的Cookie操作
举报原因:
原因补充:

(最多只允许输入30个字)