【问题标题】:Chrome extension: webRequest.onBeforeSendHeaders behaves strangeChrome 扩展:webRequest.onBeforeSendHeaders 行为奇怪
【发布时间】:2012-06-11 19:08:39
【问题描述】:

我正在尝试将“Referer”-HTTP-Header 添加到我的 Chrome 扩展程序中的某些 AJAX 请求。 您不能直接在 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 请求的事件,但不会触发在我的扩展中完成的事件。
另一个奇怪的事情是,当没有设置“阻塞”标志时一切正常,但是我无法更改标题。

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

谢谢你:)

【问题讨论】:

    标签: google-chrome google-chrome-extension


    【解决方案1】:

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

    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>" ]
    

    【讨论】:

    • 你能分享一个完整的扩展吗?
    【解决方案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 } ); }                                                                                                                       
     }
    

    【讨论】:

    • 你的意思是:if(name == p_name) { ?
    • @DaveWalley 是的。现在答案已经改变了。谢谢!
    【解决方案3】:

    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】:

      【讨论】:

        【解决方案5】:
        chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
             console.log(details);
        },{urls: ["<all_urls>"]});
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-23
          相关资源
          最近更新 更多