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;
}
}
该方法使主机应用程序有机会在当前WebView
中加载新的URL
时接管控件。返回值为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/css", "UTF-8", data);
}
该方法通知主机应用程序资源请求,并允许应用程序返回数据。如果返回值为null
,则WebView
会照常继续加载资源。否则,将使用返回响应和数据。上面的代码拦截了JavaScript
资源(.js
)的请求,并返回一个警报,而不是请求的资源。
请参阅:WebViewClient shouldOverrideUrlLoading和shouldInterceptRequest