【发布时间】:2017-11-30 17:34:12
【问题描述】:
我正在尝试从 AngularJS 发出 http 获取请求。它只在 Internet Explorer 11 中工作。当我尝试在 Chrome、Firefox 或 Edge 中进行 POST 调用时,它不起作用。
我收到以下错误:
这是我的 AngularJS 调用:
$http({
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
url: URL
}).then(function successCallback(response) {
console.log(response.data);
}, function errorCallback(response) {
console.log(response.status);
console.log(response.headers);
console.log(response.config);
});
作为后端,我有一个 Java Spring MVC 应用程序,并设置了以下标头:
HttpHeaders responseHeader = new HttpHeaders();
responseHeader.set("Access-Control-Allow-Origin","*");
responseHeader.set("Access-Control-Allow-Headers:","Content-Type");
responseHeader.set("Access-Control-Allow-Methods","POST, GET, PUT, OPTIONS, DELETE");
responseHeader.set("Content-Type","application/json");
但是当我设置断点时,我看到 angular 永远不会到达后端!这很令人困惑,我已经在互联网上搜索了很多并尝试更改默认的 AngularJS Content-Type 标头:
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
我还尝试将 POST-Request 中的 Content-Type 更改为“application/x-www-form-urlencoded” - 无效。
注意:后端和前端在同一台开发机器上运行。唯一的区别是端口,这就是为什么我对我得到一个 CORS 错误感到困惑......
我只有 POST-Requests 才有这个问题; GET 像 Charm 一样工作
编辑 1:
我认为这是 cors 的问题,并且我使用不同的端口,但是我可以将其关闭吗?
编辑 2:
现在我尝试让它与本地 tomcat 一起工作。现在我在 Tomcat 中看到请求将到达服务器:
<< Client IP>> - - [28/Jun/2017:13:43:24 +0200] "OPTIONS <<URL>> HTTP/1.1" 403 -
响应现在是 HTTP 403。在浏览器网络选项卡中,我可以看到以下请求标头:
Host: <<backend ip>>:8080
User-Agent: <<user agent>>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: access-control-allow-origin,content-type
Origin: http://<<Ip of host>>
Connection: keep-alive
该请求标头的响应如下:
Content-Type: text/plain
Content-Length: 0
Date: Wed, 28 Jun 2017 11:43:24 GMT
我已经像 tomcat 文档中的示例一样设置了 cors 过滤器:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter
当我发出 get 请求时,它仍在工作并且所有 CORS 标头都存在。 我认为第一个 OPTIONS 请求有问题。不知道为什么tomcat在OPTIONS请求来的时候没有设置CORS头。
【问题讨论】:
-
会不会和this有关?如果 Angular 正在添加它们,您可能需要在
Access-Control-Allow-Headers中添加更多内容。检查请求并准确查看发送了哪些标头。 -
如果端口不同,则违反浏览器同源策略...
-
不同的端口是什么问题?这意味着前端和后端必须在同一个端口上运行?
标签: javascript java angularjs google-chrome http