Chrome扩展程序:webRequest.onBeforeSendHeaders表现得很奇怪

时间:2012-06-11 19:08:40

标签: 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"]);

但这对我的扩展中的AJAX请求不起作用。它仅在其他AJAX请求中触发事件,而不是在我的扩展中完成的事件 另一个奇怪的事情是,当没有设置“阻塞”标志时,一切正常,但是我无法更改标题。

有没有人知道解决这个问题的方法(或实现我的目标的另一种方法:更改站点请求的“Referer”并检索内容)

谢谢:)

5 个答案:

答案 0 :(得分:3)

这是一个适用于所有实例的工作版本(当已经设置了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);

不要忘记将以下所有权限添加到清单中:

"permissions": [  "webRequest", "webRequestBlocking", "<all_urls>" ]

答案 1 :(得分:2)

当您没有阻止请求时无法设置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 } ); }                                                                                                                       
 }

答案 2 :(得分:0)

答案 3 :(得分:0)

在Chrome支持ES6的情况下,修改请求标头的操作可以像这样:

chrome.webRequest.onBeforeSendHeaders.addListener(
  details => {
    details.requestHeaders = details.requestHeaders.filter(rh => rh.name !== 'Referer');
    details.requestHeaders.push({name: 'Referer', value: 'http://the.new/referrer'});
    return {requestHeaders: details.requestHeaders};
  },
  {urls: ['<all_urls>']},
  ['blocking', 'requestHeaders'],
);

答案 4 :(得分:-1)

chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
     console.log(details);
},{urls: ["<all_urls>"]});