已经在manifest.json
申请了webRequest
和webRequestBlocking
两个权限
拦截请求尝试读请求头部的Host
信息代码如下
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
var headers = details.requestHeaders;
for(var i = 0, l = headers.length; i < l; ++i) {
if( headers[i].name == 'Host' && console.log(headers[i].name) && headers[i].value == '10.201.76.233:8080' ) {
// something
break;
}
}
return {requestHeaders: headers};
}, requestFilter, ['requestHeaders','blocking']);
但是details.requestHeaders
并没有包含Host
的信息。
请教各位,如何才能获取到每次请求的Host
信息?
或是如何确定本次的请求的Host
是10.201.76.231:8080
呢
===update===
使用公子的方法解决了上面的问题了,但还存在后续问题
chrome.webRequest.onBeforeRequest.addListener(
var headers = details.requestHeaders;
headers.push({
name: 'Authorization',
value: 'Bearer3988275f-34fe-4e95-8452-506741adf184'
});
return {requestHeaders: headers};
["http://10.201.76.231:8080/*"],
['blocking', 'requestHeaders']
);
目的是增加Authorization
信息,代码并没有报错,但是最终结果并没有把Authorization
信息加上去。
我自己来回答问题的第一部分,关键在于chrome.webRequest.onBeforeRequest.addListener
的回调函数中如何判别是否Host
,是否一定要和Host
比较,这里我用的是Request URL
信息,Request URL
并不是Request Header
的内容,当时两者有关联,如:Request URL
: http://10.201.76.233:8080/app-manage/api/...
Host
: 10.201.76.233:8080
因此我的回调函数大概是这样子的:
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
if(details.url.indexOf("10.201.76.233") != -1) {
// do something
}
}, requestFilter, ['requestHeaders','blocking']);
如果你要为多个host
增加Authorization
的请求头信息,那么你可以将多个host
存储起来,然后在回调函数判别,例如:
// 1. 利用正则表达式将details.url截取剩下 10.201.76.233:8080的格式
// 2. 取出多个host组成的数组或其他结构
// 3. hostList.indexOf(newUrl) != -1;如果成立就为本次请求增加Authorization头信息
问题的第二部分也解决了,虽然官方提到修改Authorization
头部信息是不被支持的,参照这里
我做的修改是在manifest.json
加入了<all_urls>
的权限。
https://developer.chrome.com/extensions/webRequest ,文档中明确指出了以下头信息不会被传递进来:
- Authorization
- Cache-Control
- Connection
- Content-Length
- Host
- If-Modified-Since
- If-None-Match
- If-Range
- Partial-Data
- Pragma
- Proxy-Authorization
- Proxy-Connection
- Transfer-Encoding
如果是想要限制请求的 host 的话可以使用 onBeforeSendHeaders
的第二个参数 filter
:
chrome.webRequest.onBeforeRequest.addListener(
callback,
["http://10.201.76.231:8080/*"],
['blocking', 'requestHeaders']
);