当前位置: 首页 > 知识库问答 >
问题:

如何更改请求的标题?

景仲渊
2023-03-14

是否可以更改提取事件接收的请求对象的标头?

两次尝试:

>

  • 修改现有标题:

    self.addEventListener('fetch', function (event) {
      event.request.headers.set("foo", "bar");
      event.respondWith(fetch(event.request));
    });
    

    失败,原因是未能对“头”执行“设置”:头是不可变的

    创建新的请求对象:

    self.addEventListener('fetch', function (event) {
      var req = new Request(event.request, {
        headers: { "foo": "bar" }
      });
      event.respondWith(fetch(req));
    });
    

    失败与未能构造请求:不能构造一个请求的模式是导航和一个非空的请求。

    (另请参见如何更改响应的标题?)


  • 共有3个答案

    龙亮
    2023-03-14

    你有没有尝试过类似于你提到的问题中的解决方案(如何改变响应的标题?)?

    在ServiceWorker手册中,我们手动复制请求对象以将它们存储在IndexedDB中(https://serviceworke.rs/request-deferrer_service-worker_doc.html).这是另一个原因(我们想将它们存储在缓存中,但我们无法存储POST请求,因为https://github.com/slightlyoff/ServiceWorker/issues/693),但它也应该适用于您想要做的事情。

    // Serialize is a little bit convolved due to headers is not a simple object.
    function serialize(request) {
      var headers = {};
      // `for(... of ...)` is ES6 notation but current browsers supporting SW, support this
      // notation as well and this is the only way of retrieving all the headers.
      for (var entry of request.headers.entries()) {
        headers[entry[0]] = entry[1];
      }
      var serialized = {
        url: request.url,
        headers: headers,
        method: request.method,
        mode: request.mode,
        credentials: request.credentials,
        cache: request.cache,
        redirect: request.redirect,
        referrer: request.referrer
      };
    
    
    
      // Only if method is not `GET` or `HEAD` is the request allowed to have body.
      if (request.method !== 'GET' && request.method !== 'HEAD') {
        return request.clone().text().then(function(body) {
          serialized.body = body;
          return Promise.resolve(serialized);
        });
      }
      return Promise.resolve(serialized);
    }
    
    // Compared, deserialize is pretty simple.
    function deserialize(data) {
      return Promise.resolve(new Request(data.url, data));
    }
    
    段兴为
    2023-03-14

    您可以基于原始请求创建新请求并覆盖标题:

    new Request(originalRequest, {
      headers: {
        ...originalRequest.headers,
        foo: 'bar'
      }
    })
    

    另见:https://developer.mozilla.org/en-US/docs/Web/API/Request/Request

    裴昕
    2023-03-14

    只要您设置了所有选项,就可以创建新的请求对象

    // request is event.request sent by browser here 
    var req = new Request(request.url, {
        method: request.method,
        headers: request.headers,
        mode: 'same-origin', // need to set this properly
        credentials: request.credentials,
        redirect: 'manual'   // let browser handle redirects
    });
    

    如果原始的模式是导航(这就是您遇到异常的原因),并且您可能希望将重定向传递回浏览器,让它更改其URL,而不是让获取处理它。

    请确保您没有在GET请求上设置主体——获取不喜欢它,但是浏览器在响应来自POST请求的重定向时,有时会用主体生成GET请求。获取不喜欢它。

     类似资料:
    • 我有一个用例,我需要更改的标题。例如,我有一个餐厅单元,当向右滑动时,我显示书签(104),其中书签是动作,104表示已经有104个人给它加了书签。当点击它时,我希望它更改为书签(105),因为很明显有一个新用户(当前用户自己)已经将其加入书签。我该怎么做呢?尝试了下面的代码,它不工作。

    • 我正在尝试使用JSoup访问java中的在线api。通过我的浏览器,我可以很好地导航到url,并得到json数据作为回报。但是,如果我使用Jsoup,url会发生更改,并且会从中删除“/api”。例如:https://www.onehash.com/api/archived_contest/122/我可以通过浏览器很好地打开它,但如果我使用jsoup连接到它,url就会变成https://www.

    • 如何在java过滤器中更改请求体以防止< code>XSS攻击?我构建了< code > http servlet requestwrapper 并使用< code>getparameter来更改主体,但得到流关闭异常。

    • 问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话

    • 我将Spring Security集成到一个现有的Spring Boot项目(版本:1.5.3.Release)中。 例如:GET请求指向: 我的类是: 相关部分: 安全筛选器链:[WebAsyncManagerIntegrationFilter SecurityContextPersistenceFilter HeaderWriterFilter CSrffilter LogoutFilter