use*_*556 7 google-chrome google-chrome-extension
我正在尝试在我的Chrome扩展程序中为某些AJAX请求添加"Referer"-HTTP-Header.您无法在AJAX请求中直接更改它,因此我尝试使用webRequest api更改它:
chrome.webRequest.onBeforeSendHeaders.addListener(function(data) {
console.log("onBeforeSendHeaders fired");
var xdata=data.requestHeaders;
xdata.push({
"name":"Referer",
"value": "http://the.new/referrer"
})
return {requestHeaders: xdata};
}, { //Filter
urls: ["<all_urls>"], //For testing purposes
types: ["xmlhttprequest"]
},["requestHeaders","blocking"]);
Run Code Online (Sandbox Code Playgroud)
但这对我的扩展中的AJAX请求不起作用.它仅在其他AJAX请求上触发事件,但不在我的扩展中完成.
另一个奇怪的事情是,当没有设置"阻塞"标志时,一切正常,但是我无法更改标题.
有没有人知道解决这个问题的方法(或实现我的目标的另一种方式:更改站点请求的"Referer"并检索内容)
谢谢 :)
这是一个适用于所有情况的工作版本(当已经设置了引用标头时或尚未设置时。)
var requestFilter = {
urls: ["<all_urls>"]
},
extraInfoSpec = ['requestHeaders', 'blocking'],
handler = function(details) {
var isRefererSet = false;
var headers = details.requestHeaders,
blockingResponse = {};
for (var i = 0, l = headers.length; i < l; ++i) {
if (headers[i].name == 'Referer') {
headers[i].value = "http://your-url.com/";
isRefererSet = true;
break;
}
}
if (!isRefererSet) {
headers.push({
name: "Referer",
value: "http://your-url.com/"
});
}
blockingResponse.requestHeaders = headers;
return blockingResponse;
};
chrome.webRequest.onBeforeSendHeaders.addListener(handler, requestFilter, extraInfoSpec);
Run Code Online (Sandbox Code Playgroud)
不要忘记将以下所有权限添加到您的清单中:
"permissions": [ "webRequest", "webRequestBlocking", "<all_urls>" ]
Run Code Online (Sandbox Code Playgroud)
当您没有阻塞请求时,您无法设置 Referrer 标头的原因是该请求可能已经发出 - 您将收到异步通知,并且无法更改有关该请求的任何内容。
要更改标题,我使用以下代码:
function mod_headers(header_array,p_name,p_value) {
var did_set = false;
for(var i in header_array) {
var header = header_array[i];
var name = header.name;
var value = header.value;
// If the header is already present, change it:
if(name == p_name) {
header.value = p_value;
did_set = true;
}
}
// if it is not, add it:
if(!did_set) { header_array.push( { name : p_name , value : p_value } ); }
}
Run Code Online (Sandbox Code Playgroud)