Webview设置Cookie

应用场景

APP应用的某些功能, 需要调用内嵌的WebView去加载某个URL使用.  但用户在手机APP已经成功登录过了. 这时, 如果在内置浏览器去打开网页还需要用户再输入登录一次, 似乎显得不够人性化.  又或者, 用户在内置浏览器(WebView) 访问过一些页面, 想把这些有用的 Cookies 信息保存在本地.  因此, 我们会想, 要是能管理APP上浏览器(WebView) 在该站点URL的 Cookies, 使后台识别为已登录, 蛮不错的~   这里我们使用 CookieSyncManager 来实现.

private void initWebView() {

    userName = AuthProvider.INSTANCE.getUserName();//用户名
    circleId = ProjectDao.getCurrProject().getCircleId();//班级id
    cookie = "xxx";//Cookie
    String url = "000";//访问地址

    //缓存模式如下:
    //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
    //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
    //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
    //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
    certificateWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//设置WebView缓存
    certificateWebview.getSettings().setJavaScriptEnabled(true);//支持javascript,如果访问的页面中有Javascript,则webview必须设置支持Javascript
    certificateWebview.getSettings().setBuiltInZoomControls(true);//进行控制缩放
    certificateWebview.getSettings().setAllowFileAccess(true);// 设置是否允许 WebView 使用 File 协议
    certificateWebview.getSettings().setAppCacheEnabled(true);// 设置WebView缓存开关,默认关闭
    certificateWebview.getSettings().setDomStorageEnabled(true);
    certificateWebview.getSettings().setDatabaseEnabled(true);

    //修改浏览器标识 User-Agent,添加统一的User-Agent
    String userAgentString = certificateWebview.getSettings().getUserAgentString();
    certificateWebview.getSettings().setUserAgentString(userAgentString+";ableskyapp,android");

    //同步cookie
    syncCookie(url,cookie);
    certificateWebview.loadUrl(url);
}

private void initHeader() {
    certificateHeader.setCenterText("电子证书");
    certificateHeader.bindLeftView(R.drawable.ic_header_back, null, CertificateActivity.this);

}

/**
 * 将cookie同步到WebView
 * @param url WebView要加载的url
 * @param cookie 要同步的cookie
 * @return true 同步cookie成功,false同步cookie失败
 * @Author JPH
 */
public boolean syncCookie(String url,String cookie) {

    //判断api版本21以上,webview做了较大的改动,同步cookie的操作已经可以自动同步、但前提是我们必须开启第三方cookie的支持
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        CookieManager.getInstance().setAcceptThirdPartyCookies(certificateWebview,true);
        CookieManager.getInstance().flush();
    }
    //判断api版本21以下
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        CookieSyncManager.createInstance(this);
    }
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.removeSessionCookie();//移除
    cookieManager.removeAllCookie();
    cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可
    String newCookie = cookieManager.getCookie(url);//获取你设置的Cookie
    CookieSyncManager.getInstance().sync();
    return TextUtils.isEmpty(newCookie)?false:true;

}

cookie  = "MASUSS=RDc1NDQ5RTc1NjU2MDQ3NDQxMDRENkUwMTZEMDg0RkIucGFzc3BvcnQ6MTkyLjE2OC4xMTAuNToxMTIxMTo0OTQwNTU4OmFwcHVzZXJfZmhpdWtiams6MTUzMzYzNzc3MzQwNjpObUZpTW1aaE1tVm1Zamt6TldRd05XWm1NelZtTWpJd01tVm1OalkxWkdZPQ%3D%3D; Domain=.ceat.net.cn; Path=/"

这样的格式,其实取用的只有“;”前面的也就是MASUSS=xxxx;这段。

如果需要多个自定义cookie,需要每个都syncCookie(url,cookie);方法调用一次。

Domain=.xxxx.xxx.com"+//作用域(在哪个域名下cookie起作用,例如http://www.baidu.com,写成Domain=.baidu.com即可";

Path=/";//Domain这个作用域下的哪个文件夹,“/”代表所有文件夹

 

certificateWebview.getSettings()不需要可以不设置,但是设置一定要在设置Cookie之前。一般都是需要下面这两条的:

certificateWebview.getSettings().setJavaScriptEnabled(true);//支持javascript
certificateWebview.getSettings().setBuiltInZoomControls(true);//进行控制缩放

WebSettings用于管理WebView状态配置,当WebView第一次被创建时,WebView包含着一个默认的配置,这些默认的配置将通过get方法返回,通过WebView中的getSettings方法获得一个WebSettings对象,如果一个WebView被销毁,在WebSettings中所有回调方法将抛出IllegalStateException异常。

//防止webview泄露
@Override
protected void onDestroy() {
    if (certificateWebview!= null) {
        certificateWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
        certificateWebview.clearHistory();

        ((ViewGroup) certificateWebview.getParent()).removeView(certificateHeader);
        certificateWebview.destroy();
        certificateWebview= null;
    }
    super.onDestroy();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值