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