Android WebView中如何为URL传递请求头?已尝试代码未生效
Android WebView 为指定URL添加请求头无效的解决方案
看起来你目前的WebViewClient实现里缺少了主动添加请求头的核心逻辑,所以才会出现请求头没生效的情况。我来给你梳理下正确的实现方式:
1. 首次加载URL时直接附带请求头
当你第一次加载目标URL时,直接使用loadUrl的重载方法,传入请求头Map:
// 构建请求头 Map<String, String> customHeaders = new HashMap<>(); customHeaders.put("X-Custom-Header", "Your-Header-Value"); // 替换成你的头键值对 // 带请求头加载目标URL webView.loadUrl("https://your-target-domain.com", customHeaders);
2. 处理页面内跳转/资源请求,确保后续请求也带指定头
如果页面内有跳转(比如点击链接打开同域名的其他页面),或者页面加载的静态资源(JS/CSS/图片)也需要这个请求头,你需要在WebViewClient里拦截请求,重新添加头:
WebViewClient webViewClient = new WebViewClient() { // 处理API 21+的所有资源请求(包括页面跳转、静态资源加载) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String targetUrl = request.getUrl().toString(); // 判断当前请求是否属于需要添加头的URL范围(可以用contains、startsWith或者正则匹配) if (targetUrl.startsWith("https://your-target-domain.com")) { try { // 重新构建请求并添加头 URLConnection connection = new URL(targetUrl).openConnection(); connection.setRequestProperty("X-Custom-Header", "Your-Header-Value"); // 返回处理后的资源响应 return new WebResourceResponse( connection.getContentType(), connection.getContentEncoding(), connection.getInputStream() ); } catch (IOException e) { e.printStackTrace(); } } return super.shouldInterceptRequest(view, request); } // 处理页面跳转(兼容旧版本API,也可以用来拦截主页面跳转) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String targetUrl = request.getUrl().toString(); if (targetUrl.startsWith("https://your-target-domain.com")) { Map<String, String> headers = new HashMap<>(); headers.put("X-Custom-Header", "Your-Header-Value"); view.loadUrl(targetUrl, headers); return true; // 拦截默认加载逻辑,使用我们带请求头的方式加载 } return super.shouldOverrideUrlLoading(view, request); } // 保留你原来的进度对话框逻辑 @Override public void onPageFinished(WebView view, String url) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } super.onPageFinished(view, url); } }; // 给WebView设置这个自定义的WebViewClient webView.setWebViewClient(webViewClient);
几个关键注意点
- 请确保请求头的键名和值没有拼写错误,很多时候无效都是因为拼写问题
- 如果是Cookie类的请求头,建议用
CookieManager来设置,而不是直接放在headers里,比如:CookieManager.getInstance().setCookie("your-target-domain.com", "cookieName=cookieValue"); - 可以用抓包工具(比如Charles、Fiddler)验证请求头是否真的被带上,这是排查问题最直接的方式
- 对于HTTPS链接,确保你的WebView没有禁用HTTPS支持(默认是支持的,除非你自定义了WebView的SSL配置)
内容的提问来源于stack exchange,提问作者Siddhesh Pawar
相关产品推荐
相关产品推荐

