Hybrid App(混合式应用)的开发过程当中少不了与WebView的交互,在涉及到帐户体系的产品中,包含了一种登陆状态的传递。好比,在Native(原生)界面的登陆操做,进入到Web界面时,涉及到帐户信息时,须要将登陆状态传递到Web里面,避免用户二次登陆。这里就涉及到WebView加载网页时的Cookie操做了。html
一般咱们在登陆时获取到用户的Cookie和Token信息,而后将其保存到sdcard的WebView缓存文件当中,这样在加载网页时,WebView会自动将当前url的本地Cookie信息放在http请求的request中,传递给服务器。前端
流程以下:java
一、Android客户端给WebView设置Cookie的代码以下:android
public boolean syncCookie() { web
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); cookie
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { app
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:
第二次进入Web:
- website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=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,方便前端网页判断请求来源,如:
- WebSettings settings = webView.getSettings();
- String ua = settings.getUserAgentString();
- settings.setUserAgentString(ua + "; android_app/1.0.0");
二、CookieManager会将这个Cookie存入该应用程序/data/data/databases/目录下的webviewCookiesChromium.db数据库的cookies表中
三、打开网页,WebView从数据库中读取该cookie值,放到http请求的头部,传递到服务器
四、客户端能够在注销登陆时清除该应用程序用到的全部cookies,避免切换帐号等操做情景产生缓存问题。
补充: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