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();
}
相關文章
相關標籤/搜索