App中Web緩存機制

Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端web頒發一個Cookie。客戶端會自動創建一個SQLit數據庫web會把Cookie自動保存進去。
當web再請求該網站時,web會把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。
webview加載web網頁時會自動的把cookie保存到手機磁盤根目錄(data/data/package_name/databases/webviewCookiesChromium.db)下。

頁面緩存

頁面緩存是指加載一個網頁時的html、JS、CSS等頁面或者資源數據。這些緩存資源是由於瀏覽器的行爲而產生 。
當web請求網站時會把 這些頁面緩存自動創建一個webviewCacheChromium文件夾保存在磁盤中。
webview加載web網頁時會自動把頁面緩存保存在手機磁盤根目錄(data/data/package_name/cache/webviewCacheChromium)下。

測試總結

測試結果
1. 清除App緩存時,Cookie不會移除(這裏指在點擊手機管理應用程序裏面該App清除緩存按鈕);
2. 清除App緩存時,頁面緩存 會移除(這裏指在點擊手機管理應用程序裏面該App清除緩存按鈕);
3. 清除App數據時,Cookie、頁面緩存 會被移除(這裏指在點擊手機管理應用程序裏面該App清除數據按鈕);
4. 卸載App重新安裝,Cookie、頁面緩存 都會被移除;
5. 通過代碼也可以使Cookie、頁面緩存 移除等(見下面代碼);

關鍵代碼

/**
 * webView加載網頁cookie的一些操作
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private WebView webView;
    private TextView textView;
    private EditText editText;
    private Button cleanButton, urlButton, cookieButton,cacheButton;
    private String url = "http://192.168.17.151/sample.aspx";
    private String cookie;
    private int i = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        loadWebView();
    }
    private void initView() {
        webView = (WebView) findViewById(R.id.webview);
        textView = (TextView) findViewById(R.id.cookie_text);
        cleanButton = (Button) findViewById(R.id.clean_button);
        urlButton = (Button) findViewById(R.id.url_button);
        cookieButton = (Button) findViewById(R.id.web_button);
        cacheButton = (Button) findViewById(R.id.clean_cache_button);
        cleanButton.setOnClickListener(this);
        urlButton.setOnClickListener(this);
        cookieButton.setOnClickListener(this);
        cacheButton.setOnClickListener(this);
    }
    /**
     * 加載網頁
     */
    private void loadWebView() {
        WebSettings settings = webView.getSettings();
        settings.setSupportZoom(true);          //支持縮放
        settings.setBuiltInZoomControls(true);  //啓用內置縮放裝置
        settings.setJavaScriptEnabled(true);    //啓用JS腳本
//        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不走緩存,重新加載新的頁面
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        webView.loadUrl(url);
        cookie = CookieManager.getInstance().getCookie(url);
        showCookies(cookie);
    }
    /**
     * 顯示當前Cookies
     */
    private void showCookies(String cookies) {
        if (!StringUtils.isEmpty(cookies)) {
            textView.setText("當前Cookie:   " + cookies);
            Log.d("cookie32", "cookie222== " + cookies);
        }
    }
    /**
     * 同步一下cookie
     */
    public static void synCookies(Context context, String url, String cookies) {
        CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        cookieManager.removeSessionCookie();//移除
        cookieManager.setCookie(url, cookies);//cookies是在HttpClient中獲得的cookie
        CookieSyncManager.getInstance().sync();
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.clean_button:
                //下面代碼清除App裏面的緩存的cookie數據
                CookieSyncManager.createInstance(this);
                CookieManager.getInstance().removeAllCookie();
                CookieSyncManager.getInstance().sync();
                break;
            case R.id.clean_cache_button:  
                //下面是清除App緩存     
                webView.cleanCache(true);        
                break;
            case R.id.url_button:
                webView.loadUrl(url);
                break;
            case R.id.web_button://設置cookie
                i++;
                synCookies(MainActivity.this, url, "cookie test = " + i);
                webView.loadUrl(url);
                cookie = CookieManager.getInstance().getCookie(url);
                showCookies(cookie);
                break;
        }
    }
}

這裏對cookie的操作主要用到 CookieSyncManager 和 CookieManager 兩個類。
詳情請看:CookieSyncManager官方API
CookieManager官方API

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章