angular-js cors请求未到达服务器
问题内容:
当我尝试进行Ajax调用时,我有一个正确配置了CORS的spring MVC API后端,我在chrome中收到以下错误
XMLHttpRequest无法加载172.20.16.45:8082/cuponza。该请求已重定向到‘172.20.16.45:8082/cuponza/’,对于需要预检的跨域请求是不允许的。
我的js代码在这里:
$scope.sendRegistrationForm = function(){
var config = {headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods' : 'GET,OPTIONS',
'Access-Control-Allow-Headers' : 'X-Requested-With, Content-Type',
'Content-Type' : 'text/plain',
'Accept-Language' : 'en-US'
}
};
$http.get("172.20.16.45:8082/cuponza",config).
success(function(data){
alert(data);
}).
error(function(data,status){
alert(status);
})
}
我尝试使用 --disable-web-security
标志启动chrome,通过这样做,我能够看到我的服务器端CorsFilter正常工作,而且我也收到了来自服务器的正确响应,这就是为什么我肯定我的错误所在客户端。正常启动chrome时,服务器上的过滤器永远不会启动。
更新:当我删除带有cors标头的配置对象时,出现以下错误
XMLHttpRequest cannot load 172.20.16.45:8082/cuponza
. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '
localhost:8100' is therefore not allowed access
UPDATE II im显示请求,如chrome所示:正常启动chrome:
选项/ cuponza HTTP / 1.1主机:172.20.16.45:8082连接:保持活动状态Access-Control-Request-
Method:GET源:localhost:8100用户代理:Mozilla / 5.0(Windows NT 6.1;
WOW64)AppleWebKit / 537.36( KHTML,例如Gecko)Chrome / 36.0.1985.143 Safari /
537.36访问控制请求标头:访问控制允许起源,接受语言,访问控制允许标题,访问控制允许方法接受: /推荐人 :localhost:8100
/接受编码:gzip,deflate,sdch接受语言:zh-cn,en; q = 0.8
以–disable-web-security模式启动chrome
GET / cuponza HTTP / 1.1主机:172.20.16.45:8082连接:keep-alive Access-Control-
Allow-Origin:* Accept-Language:zh-CN Access-Control-Allow-
Header:X-Requested-With,Content-键入用户代理:Mozilla / 5.0(Windows NT 6.1;
WOW64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 36.0.1985.143 Safari /
537.36 Access-Control-Allow-Methods:GET,OPTIONS接受: / 引用者:localhost: 8100
/接受编码:gzip,deflate,sdch
问题答案:
解决方案在您的前端有两个方面,您必须添加一个空的配置对象,如下所示
var config = {}; 然后将其添加到角度调用$ http.post(url.config);
原因是没有空的配置对象angular将方法类型设置为POST,然后过滤器检查content-type是否为text /
plain,如果发送空参数,则默认情况下未设置该类型,角度将方法设置为选项,然后将不同的逻辑应用于过滤器。
在web.xml的第二部分中,您必须在过滤器设置中添加以下标头:access-control-allow-origin到允许的标头中,如下所示
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,access-control-allow-origin</param-value>
</init-param>
有了这个,您的tomcat就准备就绪了