angular-js cors 请求未到达服务器

Posted

技术标签:

【中文标题】angular-js cors 请求未到达服务器【英文标题】:angular-js cors request not getting to the server 【发布时间】:2014-10-07 11:21:12 【问题描述】:

我有一个正确配置了 CORS 的 Spring MVC API 后端 当我尝试进行 ajax 调用时,我在 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

更新二 即时显示请求,如 chrome 所示: 正常启动chrome:

选项 /cuponza HTTP/1.1 主机:172.20.16.45:8082 连接:保持活动 访问控制请求方法:GET 来源:本地主机:8100 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/36.0.1985.143 Safari/537.36 访问控制请求标头:访问控制允许来源、接受语言、访问控制允许标头、访问控制允许方法 接受:/ 参考:本地主机:8100/ 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8

在 --disable-web-security 模式下启动 chrome

GET /cuponza HTTP/1.1 主机:172.20.16.45:8082 连接:保持活动 访问控制允许来源:* 接受语言:en-US Access-Control-Allow-Headers:X-Requested-With,Content-Type 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 访问控制允许方法:GET、OPTIONS 接受:/ 参考:本地主机:8100/ 接受编码:gzip,deflate,sdch

【问题讨论】:

【参考方案1】:

解决方案有两个 在你的前端,你必须像这样添加一个空的配置对象

var 配置 = ; 然后将其添加到角度调用中 $http.post(url.config); 这样做的原因是,如果没有空配置对象,角度将方法类型设置为 POST,然后过滤器检查内容类型是否为 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 就准备好了 CORS

【讨论】:

以上是关于angular-js cors 请求未到达服务器的主要内容,如果未能解决你的问题,请参考以下文章

带有 CORS 的 Ajax 请求未通过

服务器中的 C# webapi Cors Option 请求返回错误 404 未找到

为啥即使未启用 CORS,HTTP 请求也会在 Action 中处理? [复制]

OAuth 中的 CORS:对预检请求的响应未通过访问控制检查

Android Retrofit 发布请求未到达服务器

从 Swagger Editor 发出请求时,如何避免 CORS 错误(“无法获取”或“未找到服务器或发生错误”)?