【WebView】Android WebView中的Cookie操作


Hybrid App(混合式應用)的開發過程中少不了與WebView的交互,在涉及到賬戶體系的產品中,包含了一種登錄狀態的傳遞。比如,在Native(原生)界面的登錄操作,進入到Web界面時,涉及到賬戶信息時,需要將登錄狀態傳遞到Web里面,避免用戶二次登錄。這里就涉及到WebView加載網頁時的Cookie操作了。

 

通常我們在登錄時獲取到用戶的Cookie和Token信息,然后將其保存到sdcard的WebView緩存文件當中,這樣在加載網頁時,WebView會自動將當前url的本地Cookie信息放在http請求的request中,傳遞給服務器。

 

流程如下:

1、Android客戶端給WebView設置Cookie的代碼如下:

 

[java]  view plain copy print ?

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

 

[java]  view plain copy print ?
  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:

 

[java]  view plain copy print ?
  1. website_name=782; website_token=67715fb70d9e92cd7f9814dfdb14ecf4; app_uid=782; website_source=apk; app_login_flag=1  
第二次進入Web:

 

 

[java]  view plain copy print ?
  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,方便前端網頁判斷請求來源,如:

 

[java]  view plain copy print ?
  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,避免切換賬號等操作情景產生緩存問題。

 

 

[java]  view plain copy print ?
  1. cookieManager.removeAllCookie();  



 

補充:WebView獲取加載網頁的cookie:

 

[java]  view plain copy print ?

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM