本文的合集已經(jīng)編著成書,高級Android開發(fā)強(qiáng)化實(shí)戰(zhàn)拄养,歡迎各位讀友的建議和指導(dǎo)。在京東即可購買:https://item.jd.com/12385680.html
我還沒有看過J. K. 羅琳的"神奇動(dòng)物在哪里", 但是遇到過"神奇HTTPS重定向網(wǎng)頁在哪里", 這是一個(gè)關(guān)于WebView的故事. 在Android項(xiàng)目中, 為了更好地顯示HTML網(wǎng)頁, 必然需要重寫WebView, 在其中添加一些默認(rèn)屬性. 當(dāng)遇到HTTPS重定向網(wǎng)頁時(shí), 我們需要格外注意, 否則WebView會無法顯示.
概念補(bǔ)充
重定向: 分為兩種: 301, 302.
- 301: 永久性轉(zhuǎn)移, 網(wǎng)頁永久性地轉(zhuǎn)移至另一個(gè)地址.
- 302: 暫時(shí)性轉(zhuǎn)移, 網(wǎng)頁在24或48小時(shí)內(nèi)轉(zhuǎn)移至另一個(gè)網(wǎng)址, 不推薦, 建議使用301.
網(wǎng)站安全證書: 在客戶端瀏覽器和Web服務(wù)器之間建立一條SSL安全通道, 保證雙方傳遞信息的安全性卓舵,并且支持用戶通過服務(wù)器證書驗(yàn)證所訪問的網(wǎng)站的真實(shí)性.
案例分析
遇到的情況是這樣的. 已被定制的WebView, 加載在線問診頁面的HTTP短鏈
http://url.cn/45R45AW
無法重定向, 顯示空白, 即未調(diào)用WebView
的shouldOverrideUrlLoading
方法. 這個(gè)鏈接在瀏覽器可正常顯示, HTTP重定向(301)至HTTPS
https://test.chunyu.mobi/cooperation/wap/my_service_list/?partner=chunyu_wap
注意: 網(wǎng)頁顯示HTTPS鏈接是不安全鏈接.
同時(shí), WebView支持正常加載其他HTTP頁面, 如
http://www.chunyuyisheng.com/
WebView也支持正常加載其他HTTP重定向HTTPS頁面, 如Amazon的HTTP鏈接
http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777
HTTP鏈接重定向至HTTPS鏈接
https://www.amazon.com/gp/aw/ref=is_null
注意: 網(wǎng)頁顯示HTTPS鏈接是安全鏈接.
Why! 有的同學(xué)已經(jīng)在我的幫助下發(fā)現(xiàn)問題的所在! Chrome瀏覽器給予正確提示. 這兩個(gè)重定向的HTTPS鏈接, 一個(gè)是安全鏈接, 一個(gè)是不安全鏈接.
那什么是安全鏈接呢? 因?yàn)镠TTPS使用SSL進(jìn)行加密, 與不加密的網(wǎng)絡(luò)連接相比, 使用SSL技術(shù)可以提高數(shù)據(jù)的隱私性和安全性, 并降低被第三方攔截或?yàn)E用信息的風(fēng)險(xiǎn). 網(wǎng)站訪問者在得知使用SSL連接時(shí), 更愿意提供付款信息以及其他個(gè)人信息. 與支付相關(guān)的網(wǎng)頁, 多數(shù)都會使用SSL.
然而, 不是所有網(wǎng)站HTTPS鏈接都在Google備案, 瀏覽器無法認(rèn)證未備案的鏈接, 顯示"不安全"標(biāo)記, 而這些"不安全"的鏈接, 在Android的WebView中, 默認(rèn)無法訪問, 顯示空白頁面.
解決方案
在Web中添加如下
WebViewClient webClient = new WebViewClient() {
// ...
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 當(dāng)load通過ssl加密的https頁面熏版,但是如果這個(gè)網(wǎng)站的安全證書在Android無法得到認(rèn)證,WebView就會變成一個(gè)空白頁
handler.proceed(); // 接受信任所有網(wǎng)站的證書
}
// ...
};
setWebViewClient(webClient);
結(jié)論:
在使用通過SSL加密的HTTPS鏈接時(shí), 如果這個(gè)鏈接的安全證書無法得到認(rèn)證, 則WebView無法顯示網(wǎng)頁, 默認(rèn)空白. 注意HTTP鏈接會重定向至HTTPS鏈接, 導(dǎo)致相同情況發(fā)生. 重寫WebViewClient
的onReceivedSslError
方法, 信任全部證書, WebView才可正常顯示. Do you get it?
WebView信任全部證書會承擔(dān)部分風(fēng)險(xiǎn), 在使用時(shí)需要綜合考慮.
OK, That's all! Enjoy it!