关于webview保存cookie问题

问题描述:
最近项目上需要使用webview加载一个邮件功能,登陆时候会获取一个邮件登陆的地址,第一次打开没有问题,第二次打开就提示“cookie not matched”

开始采取的措施是每次打开URL时保存cookie,测试时发现并没有生效,且是概率性的;

代码百度上一大堆,大体思路:

  1. 在oncreate里初始化相关参数
  2. 获取cookie并保存
  3. 下次进入时候解析cookie并设置cookie

然而并没有解决cookie问题,最后没办法,动用抓包工具Fiddler4,从抓包工具数据看,少设置了一个cookie

原来时因为setCookie这个API一次只能添加一个cookie,多个cookie需要依次添加,至此问题解决;

下面从其他博客转载点写的比较有用的内容,粘点过来:
另外附上Fiddler4简单设置和使用


原文地址:http://blog.csdn.net/growing_tree/article/details/48830987

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, "cookie的值");
        cookieManager.setCookie(url, "cookie的值");
        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; 
  1. 在API 21之后,WebView实现了自动同步Cookie,不需要手动同步,所以,使用时可以添加版本判断;
  2. 实际使用过程中,我在展示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。

  1. 可以使用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


Fiddler4简单设置和使用

1 . 首先,确保安装 Fiddler 的电脑和你的手机在同一局域网内(如果电脑有线连接和WIFI不是局域网,就用手机连WIFI,然后把手机通过USB共享网络给电脑,这样电脑也能联网了),因为Fiddler只是一个代理,需要将手机的代理指向 PC 机,不能互相访问是不行的。
2. 开启Fiddler的远程连接,Fiddler 主菜单 Tools -> Fiddler Options…-> Connections页签,选中Allowremote computers to connect。效果图如下:
这里写图片描述
3. 开启好远程连接之后,重启Fiddler,不然就不会更新你刚开启的远程配置
4. 下面开始设置手机端了,获取PC的IP地址,我的IP地址是:192.168.1.123
5. 打开你的手机设置界面:
这里写图片描述
6.这里就可以抓包了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值