我正在尝试在生产服务器上调试一个问题,其中控制器内部有一个方法,由以下人员注释:
@RequestMapping(value = "/endpoint", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
在javascript中,ajax调用是针对这个端点的:
$.ajax({
type: "GET",
async: true,
url: "<%=endpointUrl%>",
dataType: "jsonp",
success: function(data){
console.log("success!");
},
error: function(xhr, options, error){
console.log("fail!");
}
});
但是在 chrome 中,我收到跨源读取阻止 (CORB( 阻止跨源响应的警告......使用 MIME 类型应用程序/json。
我以为 jsonp 用于"绕过"获取请求的同源策略?为什么它会被阻止?
编辑:其他信息,这些标头在端点中设置:
httpResponse.setHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval'");
httpResponse.setHeader("X-Content-Type-Options", "nosniff");
httpResponse.setHeader("X-XSS-Protection", "1");
将 jsonp 更改为 json,因为您的服务器返回的是内容类型 JSON,而不是 jsonp。
我想
通了。
@RequestMapping(value = "/endpoint", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
更改为
@RequestMapping(value = "/endpoint", method = RequestMethod.GET, produces = "text/javascript;charset=utf-8")
该问题是由以下原因引起的
httpResponse.setHeader("X-Content-Type-Options", "nosniff");
强制实施内容类型