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

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"并检索内容)

谢谢 :)

Erw*_*ent 5

这是一个适用于所有情况的工作版本(当已经设置了引用标头时或尚未设置时。)

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)


Dan*_*iel 3

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