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