在 Android WebView 中“拦截请求”通常有几种不同层级的做法,取决于你想拦截什么、做什么处理。下面按常见场景系统说明。
WebViewClient.shouldOverrideUrlLoading适合:拦截点击链接、页面跳转、scheme(如 app://)
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("myapp://")) {
// 拦截自定义协议
handleCustomScheme(url);
return true; // 不交给 WebView 处理
}
return false; // 继续加载
}
});
✅ 特点:
WebResourceRequest(API 21+)webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(
WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (url.contains("block.com")) {
return new WebResourceResponse(
"text/plain",
"utf-8",
null // 返回空内容,相当于拦截
);
}
return null; // 不拦截
}
});
✅ 特点:
null 表示继续@Override
public WebResourceResponse shouldInterceptRequest(
WebView view, WebResourceRequest request) {
if (request.getUrl().toString().endsWith("logo.png")) {
try {
InputStream is = getAssets().open("local_logo.png");
return new WebResourceResponse(
"image/png",
"utf-8",
is);
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
常见用途:
⚠️ WebView 本身不支持修改请求头
HttpURLConnection 发请求@Override
public WebResourceResponse shouldInterceptRequest(
WebView view, WebResourceRequest request) {
try {
URL url = new URL(request.getUrl().toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Custom-Header", "value");
return new WebResourceResponse(
"text/html",
"utf-8",
conn.getInputStream());
} catch (Exception e) {
return null;
}
}
shouldInterceptRequest(WebView, String)(已废弃)✅ 仍走 shouldInterceptRequest
如果你要:
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
// 旧 API
return null;
}
shouldInterceptRequest| 需求 | 推荐方式 |
|---|---|
| 拦截跳转 | shouldOverrideUrlLoading |
| 拦截资源 | shouldInterceptRequest |
| 修改响应 | 返回 WebResourceResponse |
| 修改请求 | 自己发 HTTP 请求 |
| 完整代理 | WebView + 本地 Proxy |
如果你有具体场景(比如:拦截广告 / 修改 Header / 登录鉴权 / 离线包 / Hybrid),可以告诉我,我可以给你针对性代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。