我从我的 asp.net 表单调用此函数,并在调用 ajax 时在 firebug 控制台上收到以下错误。
跨源请求被阻止:同源策略不允许读取 http://anotherdomain/test.json 处的远程资源。 (原因:CORS 标头
丢失)。Access-Control-Allow-Origin
var url= 'http://anotherdomain/test.json';
$.ajax({
url: url,
crossOrigin: true,
type: 'GET',
xhrFields: { withCredentials: true },
accept: 'application/json'
}).done(function (data) {
alert(data);
}).fail(function (xhr, textStatus, error) {
var title, message;
switch (xhr.status) {
case 403:
title = xhr.responseJSON.errorSummary;
message = 'Please login to your server before running the test.';
break;
default:
title = 'Invalid URL or Cross-Origin Request Blocked';
message = 'You must explictly add this site (' + window.location.origin + ') to the list of allowed websites in your server.';
break;
}
});
我已经采取了替代方法,但仍然无法找到解决方案。
注意:我没有服务器权限来进行服务器端(API/URL)更改。
这种情况通常发生在您尝试访问另一个域的资源,而另一个域的 cors 源白名单中没有您的域时。
要访问域中的资源,必须事先获得该域的“cors origin”策略的授权。
这是一项安全功能,可以避免其他域使用您服务器上的资源,或者有助于防止 网站欺骗
如果您可以控制两个域服务器,则可以解决此问题:
.htaccess
您可以将其写入
请求的域文件的
.htaccess
中:
=> 不推荐允许所有域
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
=> 推荐 仅允许预期的域
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin 'https://my-domain.example'
</IfModule>
如果您将其设置到所请求文件的响应标头中,您将允许每个人访问资源:
=> 不推荐允许所有域
Access-Control-Allow-Origin : *
或
=> 推荐 仅允许预期的域
Access-Control-Allow-Origin : http://www.my-domain.example
服务器端将其放在
<filename>.php
之上:
header('Access-Control-Allow-Origin: *');
您可以设置特定域限制访问:
header('Access-Control-Allow-Origin: https://www.example.com');
在你的ajax请求中,添加:
dataType: "jsonp",
行后:
type: 'GET',
应该解决这个问题..
希望这对你有帮助
如果您在后端使用 Express js,您可以安装包 cors,然后在您的服务器中使用它,如下所示:
const cors = require("cors");
app.use(cors());
这解决了我的问题
这对我有用:
创建 php 文件,该文件将在不使用 js 的情况下下载另一个域页面的内容:
<?
//file name: your_php_page.php
echo file_get_contents('http://anotherdomain/test.json');
?>
然后在ajax(jquery)中运行它。示例:
$.ajax({
url: your_php_page.php,
//optional data might be usefull
//type: 'GET',
//dataType: "jsonp",
//dataType: 'xml',
context: document.body
}).done(function(data) {
alert("data");
});
您必须修改服务器端代码,如下所示
public class CorsResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
}
}
看完以上答案,你一定知道为什么会遇到这个问题了。
self.send_header('Access-Control-Allow-Origin', '*')
您只需在服务器端添加上述行即可。
如果您使用 Google Cloud Armor,并且它由于 SQL 注入尝试等安全策略而拒绝请求,也可能会发生这种情况。在这种情况下,它只会返回一个带有
403 Forbidden
的 HTML 页面,并且没有您期望的标头:
HTTP/2 403 Forbidden
content-length: 134
content-type: text/html; charset=UTF-8
date: Tue, 28 Mar 2023 16:55:21 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
X-Firefox-Spdy: h2
相当老的话题,但我也遇到了同样的问题。就我而言,它是“http://”应用程序尝试调用同一页面但使用“https://”。 而不是调用它:
var url = 'https://example.com/page'
我用过
var url = 'http://example.com/page'
一切正常。
您还可以使用:
var url = 'page'
在紧要关头,您可以使用此 Chrome 扩展程序在本地浏览器上禁用 CORS。