Android中HTMLUnit添加/移除请求头未生效问题咨询
问题描述
我尝试使用HTMLUnit解析网页,创建了如下WebClient实例:
val webClient = WebClient(BrowserVersion.FIREFOX); webClient.addRequestHeader("X-Requested-With", "XMLHttpRequest") webClient.addRequestHeader( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" ) webClient.removeRequestHeader("Sec-Fetch-Mode") webClient.removeRequestHeader("Sec-Fetch-User") webClient.removeRequestHeader("Sec-Fetch-Site") webClient.removeRequestHeader("Sec-Fetch-Dest") webClient.removeRequestHeader("Upgrade-Insecure-Requests=1") webClient.addRequestHeader("TEST HEADER", "application/json") return webClient;
执行移除指定请求头、添加自定义请求头的操作后,从响应中读取请求头时发现配置未生效:移除的请求头仍存在,添加的TEST HEADER也未出现,收到的请求头如下:
{Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8, X-Requested-With=XMLHttpRequest, Upgrade-Insecure-Requests=1, User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36, Sec-Fetch-Dest=document, Sec-Fetch-Site=same-origin, Sec-Fetch-User=?1, Accept-Encoding=gzip, deflate, br, Accept-Language=en-US,en;q=0.5, Sec-Fetch-Mode=navigate}
原因分析与解决方案
1. 移除请求头失败的原因
- 移除目标错误:你写的
webClient.removeRequestHeader("Upgrade-Insecure-Requests=1")是错误的,请求头名称是Upgrade-Insecure-Requests,而非带值的Upgrade-Insecure-Requests=1,这行代码等于移除一个不存在的请求头,自然不会生效。 - HTMLUnit自动补全机制:
Sec-Fetch-*这类属于浏览器标准请求头,HTMLUnit会根据你设置的BrowserVersion自动生成并添加这些头,直接调用removeRequestHeader无法阻止它们被自动注入。
2. 自定义请求头未生效的原因
直接通过webClient.addRequestHeader添加的全局头,可能会被后续请求的局部设置覆盖,或者因请求类型(普通页面请求/AJAX请求)差异导致未被携带;如果请求是页面JavaScript发起的,全局头也可能不会自动应用。
具体解决步骤
- 修正移除请求头代码:将
webClient.removeRequestHeader("Upgrade-Insecure-Requests=1")改为webClient.removeRequestHeader("Upgrade-Insecure-Requests")。 - 拦截自动生成的请求头:添加自定义
HttpRequestInterceptor,在请求发送前强制移除不需要的头并添加自定义头,这种方式比全局设置更可靠:
webClient.addRequestInterceptor { request, _ -> request.removeHeader("Sec-Fetch-Mode") request.removeHeader("Sec-Fetch-User") request.removeHeader("Sec-Fetch-Site") request.removeHeader("Sec-Fetch-Dest") request.addHeader("TEST HEADER", "application/json") }
内容的提问来源于stack exchange,提问作者Sergei
相关产品推荐
相关产品推荐

