Webview设置Cookie

应用场景

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

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=/"html

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

若是须要多个自定义cookie,须要每一个都syncCookie(url,cookie);方法调用一次。android

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

Path=/";//Domain这个做用域下的哪一个文件夹,“/”表明全部文件夹api

 

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();
}