版权声明:本文为博主原创文章,未经博主允许不得转载。 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" />