问题描述:
最近项目上需要使用webview加载一个邮件功能,登陆时候会获取一个邮件登陆的地址,第一次打开没有问题,第二次打开就提示“cookie not matched”
开始采取的措施是每次打开URL时保存cookie,测试时发现并没有生效,且是概率性的;
代码百度上一大堆,大体思路:
- 在oncreate里初始化相关参数
- 获取cookie并保存
- 下次进入时候解析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;
}
注意事项:
- Cookie设置必须放在WevSettings设置和webView.loadUrl()方法之前;
- 当Cookie包含了多个键值对信息时,需要多次调用setCookie方法,而不是使用下面这种添加分号的形式拼接字符串:
website_name=782; website_token=8f47c21816cb596c93b97d64adb7eb9b; JSESSIONID=4315103E6AB51DE5BA3D910772735D1C; website_name=782; website_token=294539a5631280a2cdbf99f0e906dc21;
- 在API 21之后,WebView实现了自动同步Cookie,不需要手动同步,所以,使用时可以添加版本判断;
- 实际使用过程中,我在展示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。
- 可以使用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.这里就可以抓包了