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就准备就绪了