Javascript 如何删除CORB警告?

Javascript 如何删除CORB警告?,javascript,jquery,google-chrome,cors,cross-origin-read-blocking,Javascript,Jquery,Google Chrome,Cors,Cross Origin Read Blocking,Chrome一直工作到73版。现在它向我抛出一个CORB警告,并阻止我的chrome扩展运行 这是我的ajax jquery代码,没什么特别的 $.ajax({ url: this.url + "api/users", type: 'get', data: { account_id: this.account_id(), user_id: this.user_id(), person_id: person_id }, success: function (da

Chrome一直工作到73版。现在它向我抛出一个CORB警告,并阻止我的chrome扩展运行

这是我的ajax jquery代码,没什么特别的

  $.ajax({
    url: this.url + "api/users",
    type: 'get',
    data: { account_id: this.account_id(), user_id: this.user_id(), person_id: person_id },
    success: function (data) {
      //do stuff
    }
});
我确实注意到,如果我删除x-content-type-options头,使其不再读取“nosniff”,我可以得到一些要返回的Ajax请求,而不是其他请求。我不确定这是否意味着什么,但我注意到返回数组的json请求工作正常,而其他请求则没有

remove_keys = %w(X-Content-Type-Options)
response.headers.delete_if{|key| remove_keys.include? key}

[{'id' : '123'}] <-worked
{'id' : '123'} <- did not work (not sure if means anything)
来自响应的标题

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: x-auth_token
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: chrome-extension://mhikhjencpecbhelhjgdcgpdhlhdlhjh
Access-Control-Expose-Headers: 
Access-Control-Max-Age: 1728000
请求头

Provisional headers are shown
Accept: */*
Origin: chrome-extension://mhikhjencpecbhelhjgdcgpdhlhdlhjh
Referer: https://3.basecamp.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

我如何才能在不因CORB而删除正文的情况下返回响应正文?

看起来您正在将CORS标头放入请求中。您需要将它们放在响应中。

我找到了一个解决方法。对某些人来说可能有点过分了,但我花了15分钟才修好所有的东西。在内容脚本中,将所有ajax调用包装到一个函数中:

将ajaxGet函数添加到内容脚本:

function ajaxGet(data){
    return new Promise(function (resolve, reject) {
        chrome.runtime.sendMessage({action: 'ajaxGet', data: data}, function (response) {
            console.log(response)
            if(response&&!response.statusText){//Might need some work here
                resolve(response);
            } else {
                reject(response)
            }
        });
    });
}
并在your background.js中添加一个侦听器:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
   if(request.action=="ajaxGet"){
       $.ajax(request.data).then(sendResponse,sendResponse)
       return true //telling chrome to wait till your ajax call resolves
   }
})
代替

$.ajax({
    url: this.url + "api/user_boards",
    type: 'get',
    data: { account_id: this.account_id()}
}) 
召唤

如果您不想在background.js中使用jquery,可以使用Xhr调用代替。大概是这样的:

var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
    sendResponse(this.responseText)
  } else {
    //handle errors
  }
});

xhr.open("GET", request.data.url);

xhr.send(data);

您必须自己处理标题

Chrome73注入了一些新的安全性。只需尝试使用
chrome.runtime.sendMessage
将xHTTP请求移动到后台脚本,并使用
SendResponse
回调获取响应

在内容或弹出式脚本中,将ajax替换为:

chrome.runtime.sendMessage(
  { action: "check", data: {/* params for url */}}, 
  // callback with url response
  function(response) {
    if( response.success ) {
      var myDataFromUrl = response.data;
      ...
    } else {
      console.log('Error with `check`,', response.data);
    }
  }
);
从后台脚本:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    var url = 'https://mysyte.com/';
    if(request.action === 'check' ) {
      url = url + 'check'
      ajax( url, request.data, 
        success: function( d ) {
          sendResponse({success: true, data: d});
        },
        error : function( d ) {
          sendResponse({success: false, data: d});
        }
      );
    }
});

function ajax( url, params, cbSuccess, cbError ) { ... }

在解决了CSP和CORS问题之后,我仍然在OPTIONS方法调用上收到警告(这是针对跨域调用的)


我在服务器上通过将OPTIONS方法调用(不返回任何数据)的内容类型设置为“application/octetstream”来修复它。没有更多的警告

我的扩展也有同样的问题,对于使用外部API的扩展来说,这可能是真的……嗨,你解决了吗?目前我正在OSX上运行Chrome,使用:open-a“Google Chrome”-args--disable web security--user data dir………这解决了问题,但我不想这样做。好的,我通过在.htaccess中添加标题集访问控制允许源“*”解决了我的问题。我想知道我会如何将它具体限制到。尝试将*替换为-不起作用。另请参见,您的意思是最后一节的标题?抱歉,我相信这些实际上是响应标题。您可以从ajax请求中看到,我没有在请求中放置任何头。@JohnPollard那些(
User-Agent
Referer
,等等)肯定是请求头。您是对的,其中一些是。我修正了密码。抱歉,这是一个漫长的一天试图解决这个问题!
chrome.runtime.sendMessage(
  { action: "check", data: {/* params for url */}}, 
  // callback with url response
  function(response) {
    if( response.success ) {
      var myDataFromUrl = response.data;
      ...
    } else {
      console.log('Error with `check`,', response.data);
    }
  }
);
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    var url = 'https://mysyte.com/';
    if(request.action === 'check' ) {
      url = url + 'check'
      ajax( url, request.data, 
        success: function( d ) {
          sendResponse({success: true, data: d});
        },
        error : function( d ) {
          sendResponse({success: false, data: d});
        }
      );
    }
});

function ajax( url, params, cbSuccess, cbError ) { ... }