Ответ 1
Реализация Android WebKit позволяет разработчику изменять WebView через android.webkit.WebSettings, например
- Поддержка JavaScript,
- Поддержка плагинов,
- Доступ к файловой системе,
- Проверка ресурсов и т.д.
В Проверка ресурсов можно проверить запросы на контент и/или ресурсы, переопределив методы shouldOverrideUrlLoading и shouldInterceptRequest.. p >
Но выше два метода используются для разных целей, таких как
1. shouldOverrideUrlLoading
вызывается при открытии новой страницы, тогда как shouldInterceptRequest
вызывается каждый раз, когда ресурс загружается как файл css, js файл и т.д.
2. Если пользователь интерактивно запрашивает ресурс из WebView, это возможно с помощью метода shouldOverrideUrlLoading
класса WebViewClient
для перехвата запроса. Пример кода представлен ниже. Источник
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-адрес, а return false означает, что текущий WebView обрабатывает URL-адрес. Приведенный выше код не позволяет загружать ресурсы с хоста "www.google.com".
Однако метод не перехватывает загрузку ресурсов изнутри, например, из атрибута IFRAME или src в теге HTML или SCRIPT, например. Кроме того, 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);
}
Метод уведомляет хост-приложение запроса ресурса и позволяет приложению возвращать данные. Если возвращаемое значение равно null, WebView продолжит загрузку ресурса, как обычно. В противном случае будет использоваться ответ возврата и данные. Приведенный выше код перехватывает запросы на ресурсы JavaScript (.js) и возвращает предупреждение вместо запрашиваемого ресурса.
Смотрите еще: WebViewClient shouldOverrideUrlLoading и shouldInterceptRequest