Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 邮递员工作时的交叉原点角度错误_Javascript_Angularjs_Cross Domain_Cors_Access Control - Fatal编程技术网

Javascript 邮递员工作时的交叉原点角度错误

Javascript 邮递员工作时的交叉原点角度错误,javascript,angularjs,cross-domain,cors,access-control,Javascript,Angularjs,Cross Domain,Cors,Access Control,我尝试从我的登录服务发布: $http.post('https://xyz/login', { headers: { 'Content-type': 'application/json', 'Accept': 'application/json', 'signature': 'asd' }

我尝试从我的登录服务发布:

$http.post('https://xyz/login',
            {
                headers: {
                    'Content-type': 'application/json',
                    'Accept': 'application/json',
                    'signature': 'asd'
                }
我得到了这个错误:

XMLHttpRequest cannot load https://xyz/login. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:1337' is therefore not allowed access.
我试过这样做:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
还有这些:

"Access-Control-Allow-Origin": "*";
"Access-Control-Allow-Headers": "X-Requested-With";
"Access-Control-Allow-Methods": "GET, POST", "PUT", "DELETE";
有趣的是,邮递员在工作。 我该怎么办


谢谢。

您的请求包括非简单标题
内容类型
签名
,必须包含在响应的
访问控制允许标题
标题中

Content-type
有时是一个简单的标题,但仅针对特定值。
application/json
不是这些值之一,它会导致
Content-type
变得不简单。)

在服务器的飞行前响应中将
内容类型
添加到
访问控制允许标题


邮递员不受同源策略的约束,因此不需要服务器提供CORS支持。

您的浏览器在发布前是否发出选项请求? 检查“网络”选项卡 我以前遇到过这样的问题:浏览器或Angular(不知道是哪个)发出了选项请求,而服务器没有


“访问控制允许方法”:“获取、发布”、“放置”、“删除”、“选项”

不确定您是否已经拥有所需的信息。但在我的本地web服务器中—当我使用postman发出http请求时,它会将以下内容添加到头中:

标题: {host:'localhost', 连接:“保持活力”, pragma:'无缓存', “缓存控制”:“无缓存”, “用户代理”:“Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/47.0.2526.106 Safari/537.36”, 接受:“/”, 引用者:“”, “接受编码”:“gzip,deflate,sdch”, “接受语言”:“en-US,en;q=0.8”}

以下是我在表格中看到的: [“主机”, '本地主机', “连接”, "活下去",, “布拉格语”, “没有缓存”, “缓存控制”, “没有缓存”, “用户代理”, “Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/47.0.2526.106 Safari/537.36”, “接受”, '/', “Referer”, '', “接受编码”, “gzip,deflate,sdch”, “接受语言”, ‘en-US,en;q=0.8’]


因此,您可能只需要将您的客户端伪装成一个可识别的浏览器客户端。

您的服务器上是否启用了CORS?有关详细信息,请参阅。这不是我的服务器,这是一个外部服务。我猜启用cors是因为我可以通过Postman获得响应Postman不运行正常的Web上下文,也不受同源策略的约束。请参阅有趣的内容,感谢您的深入了解,在本例中,是否还需要签名条目?仍然相同。我将此添加到我的angular应用程序配置中:
$httpProvider.defaults.useXDomain=true;删除$httpProvider.defaults.headers.common['X-Requested-With']$httpProvider.defaults.headers.common['Access-Control-Allow-headers']='*'$httpProvider.defaults.headers.common['Access-Control-Allow-Origin']='*'$httpProvider.defaults.headers.common['Access-Control-Allow-Methods']='*'
@user3712353哦,我假设后面的代码片段正在服务器端代码上运行。您需要让服务器发送正确的CORS headers.Hwy。不,它在我的角度配置中。服务器不是我的。如您所见,我为方法添加了“*”。它仍然不工作。确定在节点代码中转储POSTMAN正在使用的标题,转储浏览器使用的标题,比较两者,并尝试将它们与正在工作的配置对齐!我会得到有角度的标题,并在邮递员中使用它们,看看它是否失败。通过一次删除一个标题,找出导致问题的标题。您只需从浏览器的“网络”选项卡获取标题,然后将其复制到邮递员请求,然后开始一次删除一个标题。我发布到的服务不是我的,它是用于身份验证的外部服务。我不知道我应该在angular代码中更改什么,是的,它以方法发送选项OK选项请求是angular或浏览器在跨域请求时自动发出的-它不是由您发出的。选项请求试图找出CORS标题是否足以让您发表文章。问题可能是,因为选项似乎是一个新事物,所以您想要发布的服务器也不支持选项!我相信有一种方法可以阻止Angular提出选择请求,但我不确定。POST请求是否在选项请求之后提出?或者只是一个选项请求?浏览器决定是否进行选项预飞行;我不能改变这个决定。正在发送选项请求,因为该请求是一个非简单的跨源请求,需要预飞行。预飞行失败(因为服务器没有发送正确的CORS头),因此实际的POST请求永远不会发送。(请参阅和/或)(@user3712353)嘿。我不明白,是相同的头。我的意思是,我想你需要在你的代码中放一些类似的东西:var头={host:'localhost',connection:'keep alive',pragma:'no cache','cache control','no cache','user agent','Mozilla/5.0(windowsnt 10.0;WOW64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/47.0.2526.106 Safari/537.36',accept:'/',引用:''accept encoding':'gzip,deflate,sdch','accept language':'en-US,en;q=0.8'};var options={host:'localhost',path:'/',port:'80',headers:headers};var req=http.request(选项、回调);我想我可能刚刚意识到了这个问题——我刚刚注意到您尝试使用ssl/tls(通过https)。我认为,如果您在指向不同网站的浏览器客户端中使用angular JS,这将不起作用。我认为这可能是一个安全限制:如果您试图在同一个站点上执行帖子,不要在其前面加上完整的域/主机:只需使用路径:“login/”或“login”