chrome.webRequest重定向数据URL

时间:2017-08-16 12:59:49

标签: google-chrome google-chrome-extension

我想将请求重定向到data-url。

// background.js
chrome.webRequest.onBeforeRequest.addListener(
  function (details) {
    const url = details.url

    if(url == 'http://www.example.com') {
      return {
        redirectUrl: 'data:application/json; charset=utf-8,' + JSON.stringify({"a":1, "b": 2})
      }
    }

    return {cancel: false}
  },
  {urls: ["<all_urls>"]},
  ["blocking"]
)

现在,我在页面中启动ajax:

var xhr = new XMLHttpRequest()
// xhr.withCredentials = true
xhr.open('GET', 'http://www.example.com', true)
xhr.send()
xhr.onreadystatechange = function () {
  if (xhr.readyState == 4) {
      var status = xhr.status;
      if (status == 200) {
          console.log(xhr.responseText)
      }
  }
}

它显示了{"a":1, "b": 2}

但是,如果我添加withCredentials,那就是错误:

图片内容:

Fetch API无法加载数据:application / json;字符集= UTF-8,{&#34;&#34;:1,&#34; B&#34;:2}。 &#39; Access-Control-Allow-Credentials&#39;回复中的标题是&#39;&#39;哪一定是真的&#39;当请求的凭据模式为&#39; include&#39;时。起源&#39; null&#39;因此不允许访问。 (index):1 Uncaught(在promise中)TypeError:无法获取

如何解决?

我尝试在onHeadersReceived中添加Access-Control-Allow-Credentials标头,但它没有效果。

chrome.webRequest.onHeadersReceived.addListener(
    function (details) {
      if(details.url == 'http://www.example.com') {
        details.responseHeaders.forEach(header => {
          if(header.name == 'Access-Control-Allow-Origin') {
          header.value = 'null'
        }
      })

      details.responseHeaders.push({
        name: 'Access-Control-Allow-Credentials',
        value: 'true'
      })
    }

    return {responseHeaders:details.responseHeaders};
  },
  {urls: ["<all_urls>"]},
  ["responseHeaders","blocking"]
)

0 个答案:

没有答案