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