Android的WebKit的執行允許開發者通過android.webkit.WebSettings類修改WebView如
- 支持JavaScript的,
- 支持插件,
- 文件系統訪問,
- 資源檢查等等
在資源檢查,可以通過覆蓋shouldOverrideUrlLoading和shouldInterceptRequest方法來檢查內容和/或資源的請求。
但以上兩種方法都使用了不同的目的,如
1. shouldOverrideUrlLoading
當一個新的一頁即將被打開,而每shouldInterceptRequest
資源加載像一個CSS文件時間被稱爲被調用時,一個js文件等。
2.如果用戶在WebView中交互式地請求資源,則可以通過使用WebViewClient
類的shouldOverrideUrlLoading
方法來攔截請求。代碼示例如下。 Source
private class MyWebViewClient extends WebViewClient {
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("www.google.com")) {
return true;
}
return false;
}
}
的方法使主機應用程序的機會,當一個新的URL是關於在當前的WebView要加載接管控制權。返回值爲true表示主機應用程序處理URL,而返回false表示當前WebView處理URL。上面的代碼阻止從主機「www.google.com」加載資源。
但是,該方法不會攔截來自內部的資源加載,例如,來自HTML或SCRIPT標記內的IFRAME或src屬性。另外XmlHttpRequests也不會被攔截。爲了攔截這些請求,您可以使用WebViewClient shouldInterceptRequest
方法。代碼示例如下。
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
if (url.contains(".js")) {
return getWebResourceResponseFromString();
} else {
return super.shouldInterceptRequest(view, url);
}
}
private WebResourceResponse getWebResourceResponseFromString() {
return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')"));
}
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) {
return new WebResourceResponse("text/javascript", "UTF-8", data);
}
該方法通知主機應用程序的資源請求,並允許應用程序返回數據。如果返回值爲空,則WebView將像往常一樣繼續加載資源。否則,將使用返回響應和數據。上面的代碼攔截對JavaScript資源(.js)的請求,並返回警報而不是請求的資源。
多見於:WebViewClient shouldOverrideUrlLoading和shouldInterceptRequest
顯然,shouldOverrideUrlLoading()不獲取時使用loadURL被稱爲第一個調用。與流行的觀點相反,當從已經加載的網頁中點擊任何內部鏈接時,shouldOverrideUrlLoading()被調用。 – AnupamChugh 2017-09-18 12:30:02