CORB(Cross-Origin Read Blocking)是从Vanilla JS getJSONP到Google Apps Script的过程中的一种安全策略。
CORB(Cross-Origin Read Blocking)是从Vanilla JS getJSONP到Google Apps Script的过程中的一种安全策略。
我使用Jquery AJAX调用了第三方API,但在控制台中出现了以下错误:
跨域读取阻止(CORB)导致跨域响应我的URL被拦截,MIME类型为application/json。详细信息请参阅https://www.chromestatus.com/feature/5629709824032768。
我使用了以下代码进行Ajax调用:
$.ajax({ type: 'GET', url: My Url, contentType: 'application/json', dataType:'jsonp', responseType:'application/json', xhrFields: { withCredentials: false }, headers: { 'Access-Control-Allow-Credentials' : true, 'Access-Control-Allow-Origin':'*', 'Access-Control-Allow-Methods':'GET', 'Access-Control-Allow-Headers':'application/json', }, success: function(data) { console.log(data); }, error: function(error) { console.log("FAIL....================="); } });
当我在Fiddler中检查时,我收到了响应数据,但没有在Ajax的success方法中获得。
请帮助我解决这个问题。
CORB from Vanilla JS getJSONP to Google Apps Script的问题是由于浏览器缓存导致的,解决方法是清除浏览器缓存。
根据提供的链接,大多数情况下,被阻止的响应不会影响网页的行为,可以安全地忽略CORB错误消息。例如,当被阻止的响应体已经为空,或者响应将被发送到无法处理它的上下文(例如将404错误页面发送到<img>
标签)时,会出现警告。
在这个问题中,作者遇到了CORS(跨域资源共享)错误,导致请求的响应为空。解决方法是清除浏览器缓存,这样CORS错误就消失了。作者之所以受到CORS错误的影响,是因为Chrome浏览器将端口号保存在缓存中,而服务器只接受localhost:3010
,而作者却使用了localhost:3002
,这是由于浏览器缓存导致的。
问题的原因是在服务器响应中设置了'Access-Control-Allow-Origin:*'的头部信息,但是由于响应中包含了'Content-Type: application/json',导致出现了CORB错误。解决方法是将服务器响应中的'Content-Type'头部信息更改为其他值,或者在客户端代码中使用一种不会触发CORB错误的方法来获取响应数据。
以下是解决该问题的一种可能方法:
function getJSONP(url, callback) { var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random()); window[callbackName] = function(data) { delete window[callbackName]; document.body.removeChild(script); callback(data); }; var script = document.createElement('script'); script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName; document.body.appendChild(script); } getJSONP('http://example.com/api/data', function(data) { console.log(data); });
以上代码是使用纯JavaScript实现的getJSONP函数,它通过创建一个动态的script标签来获取跨域的JSON数据。这种方法不会触发CORB错误,因为它不直接将JSON数据作为响应体返回,而是通过回调函数获取数据。
在上述代码中,首先生成一个随机的回调函数名称,然后将该名称作为url的查询参数,将其赋值给script标签的src属性。接着将script标签添加到文档的body中,这样浏览器就会发送一个GET请求获取JSON数据。当服务器返回数据时,它会调用带有数据参数的回调函数,并将数据作为参数传递给它。
通过使用这种方法,可以绕过CORB错误,并成功获取跨域的JSON数据。
从上面的内容可以得出以下结论:
问题的原因:
- 使用JSONP请求,但服务器响应的是JSON格式数据。
- 浏览器拒绝将JSON作为JSONP处理,因为这可能会造成安全风险。
- 代码中存在大量冲突的指令,可能是由于对跨域请求的不了解。
解决方法:
- 了解同源策略的工作原理。
- 移除不相关的代码,如`contentType: 'application/json'`、`dataType: 'jsonp'`、`responseType: 'application/json'`、`xhrFields: { withCredentials: false }`和`headers`部分的代码。
以下是整理后的文章:
你正在尝试进行JSONP请求,但服务器响应的是JSON格式数据。由于存在安全风险,浏览器拒绝将JSON作为JSONP处理。JSONP是在CORS(跨域资源共享)出现之前用于解决同源策略问题的一种hack方式。与JSONP相比,CORS是一种更干净、更安全、更强大的解决方案。
在代码中,你试图一次性使用多个冲突的指令来进行跨域请求。你需要了解同源策略的工作原理。以下是关于你的代码的一些说明:
`contentType: 'application/json'`:在使用JSONP时会被忽略。
`dataType: 'jsonp'`:服务器没有响应JSONP,因此可以将其移除。
`responseType: 'application/json'`:这不是jQuery.ajax支持的选项,需要移除。
`xhrFields: { withCredentials: false }`:这是默认的设置,除非你在ajaxSetup中将其设置为true,否则可以移除。
`headers`部分的代码:这些是响应头,应该放在响应中而不是请求中。此外,这将使跨域请求变得非简单,除了基本的CORS权限外,你还需要处理预检请求。
为了解决问题,你需要了解同源策略的工作原理,并移除不相关的代码。