https http 混合訪問_https 頁面中引入 http 資源的解決方式


解決android 5.0 webview不能加載http與https混合內容的問題

在使用WebView加載https資源文件時,如果認證證書不被Android認可,那么會出現無法成功加載對應資源問題。那么,我們就要針對這一狀況作出對應的處理。

 

1、解決方法:啟用mixed content  ,webview默認不允許加載http與https混合內容:

比如你訪問的網頁為http://xxx.com/a.html,則如果a.html包含了https的資源,則此資源不會顯示。如果仔細觀察log,可以看到如下的內容提示:

 

********was loaded over HTTPS, but requested an insecure image********

該怎么解決呢?很簡單,只需設置webSettings,允許其加載混合網絡協議內容即可。  

1 //webview在安卓5.0之前默認允許其加載混合網絡協議內容
2 // 在安卓5.0之后,默認不允許加載http與https混合內容,需要設置webview允許其加載混合網絡協議內容
3 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
4     settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
5 }

 

從Android5.0以后,當一個安全的站點(https)去加載一個非安全的站點(http)時,需要配置Webview加載內容的混合模式,一共有如下三種模式: 

  1. MIXED_CONTENT_NEVER_ALLOW:Webview不允許一個安全的站點(https)去加載非安全的站點內容(http),比如,https網頁內容的圖片是http鏈接。強烈建議App使用這種模式,因為這樣更安全。
  2. MIXED_CONTENT_ALWAYS_ALLOW:在這種模式下,WebView是可以在一個安全的站點(Https)里加載非安全的站點內容(Http),這是WebView最不安全的操作模式,盡可能地不要使用這種模式。
  3. MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當涉及到混合式內容時,WebView會嘗試去兼容最新Web瀏覽器的風格。一些不安全的內容(Http)能被加載到一個安全的站點上(Https),而其他類型的內容將會被阻塞。這些內容的類型是被允許加載還是被阻塞可能會隨着版本的不同而改變,並沒有明確的定義。這種模式主要用於在App里面不能控制內容的渲染,但是又希望在一個安全的環境下運行。

 

2、解決方法:設置WebView接受所有網站的證書

在認證證書不被Android所接受的情況下,我們可以通過設置重寫WebViewClient的onReceivedSslError方法在其中設置接受所有網站的證書來解決,具體代碼如下: 

 1 webView.setWebViewClient(new WebViewClient() {
 2             @Override
 3             public void onReceivedSslError(WebView view,
 4                     SslErrorHandler handler, SslError error) {
 5                 // TODO Auto-generated method stub
 6                 // handler.cancel();// Android默認的處理方式
 7                 handler.proceed();// 接受所有網站的證書
 8                 // handleMessage(Message msg);// 進行其他處理
 9             }
10 });

 

注:在重寫WebViewClient的onReceivedSslError方法時,注意一定要去除onReceivedSslError方法的super.onReceivedSslError(view, handler, error);,否則設置無效。 

熊貓辦公https://www.wode007.com/sites/73654.html

解決瀏覽器默認是不允許在 https 里面引用 http 資源

瀏覽器默認是不允許在 https 里面引用 http 資源的,一般都會彈出提示框。  

用戶確認后才會繼續加載,用戶體驗非常差。而且如果在一個 https 頁面里動態的引入 http 資源,比如引入一個 js 文件,會被直接 block 掉的。Chrome v21 之后,在 SSL 加密頁面 embed 非 SSL 的 Flash 資源也會被默默的屏蔽掉,只留下一句 console 報告。

 

1、解決方法:讓網站同時准備了 https 資源和 http 資源,通過相對協議的形式訪問:

<img src="//domain.com/img/logo.png">

簡而言之,就是將URL的協議(http、https)去掉,只保留//及后面的內容。這樣,在使用https的網站中,瀏覽器會通過https請求URL,否則就通過https發送請求。

附注:如果是瀏覽本地文件,瀏覽器通過file://協議發送請求,導致請求失敗,因此本地測試最好是搭建一個本地服務器。

 

2、解決方法:將http請求轉成https請求,添加響應頭,設置mate如下:

<meta http-equiv='Content-Security-Policy' content='block-all-mixed-content'>

或者在我們服務器響應頭中加入:

header("Content-Security-Policy: upgrade-insecure-requests");

我們的頁面是 https 的,而這個頁面中包含了大量的 http 資源(圖片、iframe等),頁面一旦發現存在上述響應頭,會在加載 http 資源時自動替換成 https 請求。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM