問題描述
在原生和h5混合開發的時候會遇到這么一個問題,用webview加載某個url時,你只是app登錄了賬號,但是網頁卻沒有,所有會禁止訪問此url,webview就會顯示白屏。
所以要訪問此url,需要帶上cookie進行訪問。這個cookie就是用app登錄時所存儲的cookie
實現方法和一些環境
網絡請求方式
HttpsUrlConnection
這里既然用到了HttpsUrlConnection 說明我所加載的url是https協議
所以webview加載的時候會白屏
報錯信息:
這是由於證書和域名不匹配,我的調試環境在內網服務器上,而證書是綁定在公網的域名上的。
所以需要webView跳過證書驗證,
跳過證書驗證
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.e("app_name",error.toString());
handler.proceed();
}
});
然后設置cookie
cookie是在app使用HttpsUrlConnect發起登錄請求時保存在本地的cookie
app登錄成功后保存cookie到本地
SharedPreferences sharedPreferences = getSharedPreferences("login",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
String cookieval = conn.getHeaderField("Set-Cookie");
editor.putString("all_cookie",cookieval);
是一個結構如下的值:
SESSION=f19b09e9-69b2-4ab4-9daf-ea224523a092; Path=/; Secure; HttpOnly
1
寫入cookie
/**
*@param cookie 上面獲取到的存儲在本地的cookie字符串
*@param url 要加載的頁面url
*/
private void setCookie(String cookie,String url) {
String StringCookie = cookie;
CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeSessionCookies(null);
cookieManager.flush();
} else {
cookieManager.removeSessionCookie();
CookieSyncManager.getInstance().sync();
}
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, StringCookie);
}
所有關鍵代碼
SharedPreferences sharedPreferences = getSharedPreferences("login",MODE_PRIVATE);
String cookie = sharedPreferences.getString("session","");
String all_cookie = sharedPreferences.getString("all_cookie","");
Log.e("weibiao",all_cookie);
webView = findViewById(R.id.other_account_service_webview);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.e("weibiao",error.toString());
handler.proceed();
}
});
initWebViewSettings();//webview的一些設置
setCookie(all_cookie,url);//在loadurl之前調用此方法
webView.loadUrl(url);