【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

转载于:https://www.cnblogs.com/yelanggu/p/10870279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值