请求的资源缺少“Access-Control-Allow-Origin”头。响应的HTTP状态代码为401。

5

我正在使用angular $http调用一个跨域REST web-service(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'头。"
Restful Web服务部署在Tomcat 8上。
我在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>

尽管我收到了相同的错误信息,但有人能帮助我修复吗?我在客户端是否遗漏了任何标头?在服务器端还需要进行其他操作吗?提前感谢。

你的应用程序有没有被缓存,而你在 web.xml 中进行的添加没有生效的可能性?(你可以通过删除其内容来强制清理 webapps 目录、重新部署应用程序并重新启动 Tomcat 来解决这个问题) - Jossef Harush Kadouri
我已经多次重启了Tomcat。 - Ashok Kumar
你能展示一下 web.xml 文件中的过滤器部分吗? - krish
<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> - Ashok Kumar
3个回答

1

我找到了根本原因。

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

我顺利地收到了响应。

现有的生产应用程序需要身份验证,但我遇到了以下错误:
请求的资源中没有'Access-Control-Allow-Origin'头。响应具有HTTP状态码401

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

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


1
这会根据链接为您提供帮助。
<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>

我也尝试了更高级的配置,但是没有成功:( - Ashok Kumar
你尝试过使用cors.allowed.headers吗?如果你在那里放置,它将不支持 - krish
我已经按照您提供的内容尝试过了。参考了 https://tomcat.apache.org/tomcat-8.0-doc/config/filter.html。 - Ashok Kumar

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接