请求的资源上不存在“Access-Control-Allow-Origin”标头。响应具有HTTP状态代码401

时间:2015-12-03 07:27:19

标签: angularjs spring rest tomcat

我使用angular $ http调用跨doamin REST Web服务(Spring)。请在下面找到代码。

$http({    
url: ' http://xxx.yyy.zzz:8080/..../sponsors',
method: 'GET',
   headers: {  'Token' : 'abc'  }
}).success(function(sponsors){
      $scope.sponsorList = sponsors;
}).error(function(sponsors){
       alert('failed to get sponsors')
});

我收到以下错误

“对预检请求的响应未通过访问控制检查:请求的资源上没有'Access-Control-Allow-Origin'标头。”

在Tomcat-8上部署了Restful Web服务。

我在tomcat / conf / web.xml中添加了一个CORS过滤器,如下所示。

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

即使我收到同样的错误。

有人可以帮我解决这个问题吗?我错过了客户端的任何标题吗?还有什么需要在服务器端完成吗?

提前致谢

3 个答案:

答案 0 :(得分:1)

这可以根据此link

为您提供帮助
<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <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</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

答案 1 :(得分:0)

也许这个流程图可以帮助您了解会发生什么:http://tomcat.apache.org/tomcat-7.0-doc/images/cors-flowchart.png

您能否向我们提供已发送OPTIONS请求的内容(请求和响应内容)?您可以通过Chrome开发工具的网络标签访问此内容...

答案 2 :(得分:0)

我找到了根本原因。

我在同一台服务器上创建了简单的hello world REST服务而无需身份验证,并调用了该服务。

我没有任何问题得到了答复。

我在现有的具有认证的生产应用程序中遇到以下错误 否&#39;访问控制 - 允许 - 来源&#39;标头出现在请求的资源上。响应具有HTTP状态代码401

所以我得出结论,PREFLIGHT请求也需要身份验证。

有人能告诉我如何在PREFLIGHT请求中发送身份验证标头吗? 我们是否可以控制PREFLIGHT请求?