0

我正在尝试从本地运行的另一个 Web 应用程序以及在端口 9090 上运行的另一个 Web 应用程序向在 localhost 端口 9080 ( http://localhost:9080/syncope/rest ) 和 Tomcat 9上运行的 Apache Syncope rest API 发起跨域 ajax 请求和 Tomcat 7 ( http://localhost:9090/es )。我在 web.xml 中为晕厥核心和 web.xml 中包含了 CORS 过滤器配置,用于 tomcat 9 (conf/web.xml),如下所示:

  <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.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>

来自请求应用程序的 Ajax 请求如下:

 $.ajax({
     url: "http://localhost:9080/syncope/rest/accessTokens/login",
     type: "POST",
     beforeSend: function(xhr) { 
         xhr.setRequestHeader("Authorization", "Basic " + btoa("admin:password")); 
       },
     crossDomain: true,
     //data: JSON.stringify(somejson),
     //dataType: "json",
     success: function (response) {
         var resp = JSON.parse(response)
         alert(resp.status);
     },
     error: function (xhr, status) {
         alert("error");
     }
 });

实际上,我尝试访问的晕厥上的任何休息 URL 都会给出以下响应:

从源“ http://localhost:9090 ”访问“ http://localhost:9080/syncope/rest/accessTokens/login ”处的 XMLHttpRequest已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我知道这是一个 CORS 问题,但我已经提供了 tomcat 配置,但它仍然存在。使用插件/代理是不可能的,因为在生产中这需要通过互联网访问。

使用以下 curl 命令可以正常工作: curl -I -u admin:password -X POST http://localhost:9080/syncope/rest/accessTokens/login

有人知道如何解决 CORS 政策问题吗?

提前致谢

4

0 回答 0