Реализация Android WebKit позволяет разработчику изменять WebView через android.webkit.WebSettings класса, такие как
- поддержка JavaScript,
- Поддержка плагинов,
- System File Access,
- Inspection ресурсов и т.д.
В Проверка ресурсов, можно проверить запросы на контент и/или ресурсы путем переопределения shouldOverrideUrlLoading и shouldInterceptRequest методов.
Но выше двух методов использовать для различных целей, таких как
shouldOverrideUrlLoading
1. вызывается, когда новая страница собирается быть открыта в то время как shouldInterceptRequest
называется каждый раз, когда ресурс загружается как файл CSS, JS файл и т. д.
2.Если пользователь интерактивно запрашивает ресурс из WebView, это возможно с помощью метода shouldOverrideUrlLoading
класса WebViewClient
для перехвата запроса. Пример кода представлен ниже. 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-адрес, а 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
По-видимому, shouldOverrideUrlLoading() не будет вызвана, когда loadUrl вызывается для первого. Вопреки распространенному мнению, shouldOverrideUrlLoading() вызывается при нажатии любой внутренней ссылки с уже загруженной веб-страницы. – AnupamChugh