应用场景
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(); }