android webview cookie保存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/smileiam/article/details/77778670

虽然说WebView 保存cookie的文章有很多,但查看了很多别人写的博客,都不满足我的要求,当然对我的实现也有一些帮助。为了以后遇到类似问题,不再需要重写搜索,特记录下来,如果正好能帮到你,那更好。

我们要实现的效果是整个app全是h5页面,只有一个url入口,首先进入登录页面,要求只要cookie还没过期,每次进入应用都是登录后的页面。而给webview设置cookie,首先要获取到cookie,同时在什么时候设置cookie也是一个关键点。

因为整个app只有一个url地址入口,如果在load此url之后再设置cookie,对于webview已经晚了,它一直会停留在登录页面,所以必须load url之前就获取cookie,并给url设置cookie。同时看网上有相关博主提出,设置cookie前,需要先初始化webview,如果在设置cookie后再初始化webview,设置允许访问js,会导致cookie设置无效。

下面说说我的具体实现,分成以下三步:

具体实现步骤:

1. webview控件设置及初始化

/**
     * 初始化
     */
    private void initView(WebView webView) {
        WebSettings webSettings = webView.getSettings();
        webView.setVerticalScrollBarEnabled(false); //垂直不显示
        webView.setHorizontalScrollBarEnabled(false);//水平滑动条不显示
        webSettings.setBuiltInZoomControls(true); // 显示放大缩小
        webSettings.setSupportZoom(true); // 可以缩放
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setDomStorageEnabled(true);//设置支持html5本地存储,有些h5页面服务器做了缓存,webview控件也要设置,否则显示不出来页面           webSettings.setSupportMultipleWindows(true);//支持多窗口
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webSettings.setDefaultTextEncodingName("UTF-8");
        webSettings.setAllowFileAccess(true);// 设置可以访问缓存文件
        webSettings.setAppCacheEnabled(true);//应用可以有缓存
        webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);//采用webview控件在应用内打开其他链接
                return true;
            }
        });

    }

2. 获取cookie

private void getCookie() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                //http连接需要放到子线程中进行请求
                    URL httpUrl = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
                    conn.setRequestMethod("GET");
                    conn.connect();
                    if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        String response = conn.toString();//在conn中会有cookie信息,如下图
                        String[] connRespnse = response.split(";");
                        if (connRespnse != null && connRespnse.length > 1) {
                            synCookies(connRespnse[1]);
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                webview.loadUrl(url);//webview控件调用需要在主线程中进行
                            }
                        });


                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }

这里写图片描述

3. 设置cookie

 /**
  *  同步一下cookie
  */
    private void synCookies(String cookie) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.createInstance(this);
        }
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可
    }

注意如果打release包,需要在混淆文件中添加以下几句:

-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}

don’t forget申请网络权限

<uses-permission android:name="android.permission.INTERNET" />

猜你喜欢

转载自blog.csdn.net/smileiam/article/details/77778670
今日推荐