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方法,而不是使用下面这种添加分号的形式拼接字符串:

  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:

  1. website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1

第二次进入Web:

  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,方便前端网页判断请求来源,如:

  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,避免切换账号等操作情景产生缓存问题。

  1. 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操作的更多相关文章

  1. jquery中的cookie操作

    使用前在页面中引入下面的代码 /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Cop ...

  2. js中的cookie操作

    一.js cookie   使用时把此段代码引入页面 (function (factory) { if (typeof define === 'function' && define. ...

  3. Javascript中的Cookie操作

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. Android 系统中运行jar文件

    在android系统中运行jar操作步骤: 1.       打包编译jar包 2.       将jar包导入android设备中 adb push test.jar  /data/local/tm ...

  5. django系列7.2--django中的cookie和session基本操作,浏览器登陆验证的不同实现

    django中的cookie和session(02)–操作 一.Django中的cookie操作 ctrl + shift + del 是谷歌浏览器中清除页面缓存和cookie的快捷键 1.设置coo ...

  6. Android webview 写入cookie的解决方法以及一些属性设置

    原文地址:https://www.2cto.com/kf/201703/616868.html Android webview 写入cookie的解决方法以及一些属性设置,webview怎么设置写入C ...

  7. Android WebView与JavaScript交互操作(Demo)

    应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http:// ...

  8. Android WebView保存Cookie登录

    因项目需要,需要在App中嵌入网页,使用Nativie方式登录,然后将cookie保存到WebView中,实现免登录功能.同步Cookie到WebView的方法网上有大量的参考资料,也可以参考下面的代 ...

  9. Android WebView中那些不得不解决的坑~~

    前面那张hybrid开发心得 有人问 怎么解决不用onJsPrompt 来回调js函数的问题.其实很简单,就是在在你的jscalljava回调函数内 另外开个线程去load js代码即可: wb.po ...

随机推荐

  1. faster-rcnn在ubuntu16.04环境下的超级详细的配置(转)

    首先,下载好必须要的安装包.为了方便,我已经全部上传在了百度云. - ubuntu16.04系统 链接:http://pan.baidu.com/s/1geU8piz 密码:25mk - cuda8. ...

  2. 快速开平方取倒数的算法--嵌入式ARM转载

    #include<stdio.h> #include<string.h> #include <stdlib.h> /* atof */ /* 计算=1/sqrt(n ...

  3. jquery中ajax跨域加载

    今天学习ajax跨域加载,先来一段代码,异步加载的链接是爱奇艺的开源,我直接拿来用作测试 <!DOCTYPE html> <html lang="en"> ...

  4. LightOJ - 1173 - The Vindictive Coachf(DP)

    链接: https://vjudge.net/problem/LightOJ-1173 题意: The coach of a football team, after suffering for ye ...

  5. zookeeper先验知识(2PC+paxos)

    一.2PC两阶段提交: 在分布式事务中,每个机器节点只能够明确知道自己事务操作的结果,是成功还是失败,而无法获取其他分布式节点的操作结果,因此在事务操作需要跨多个分布式节点时,需要引入一个协调者统一调 ...

  6. 【DP入门到入土】

    DP例题较多,可以根据自己需求食用~ update:下翻有状压DP入门讲解,也只有讲解了(逃~ DP的实质,就是状态的枚举. 一般用DP解决的问题,都是求计数或最优问题,所以这类问题,我们也可以用搜索 ...

  7. setitimer()函数

    定时器时间函数 struct itimerval: struct itimerval *new_value,其定义如下: struct itimerval { struct timeval it_in ...

  8. html同行两个div浮动后下一个div怎么换行的问题

    传送门:https://blog.csdn.net/asdfg6541/article/details/78514535

  9. C平衡二叉树(AVL)创建和删除

    AVL是最先发明的自平衡二叉查找树算法.在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n.查找.插入和删除在平均和最坏情况下 ...

  10. PostgreSQL定时自动备份

    PostgreSQL定时自动备份 简介 PostgreSQL数据库中未提供数据库的定时备份功能,所以需要结合备份和定时job功能来共同实现. 这里我选取了2种定时job方式,crontab是Linux ...