Tomcat CORS 过滤器和 Spring 安全

Tomcat CORS filter and Spring Security

我正在使用 Tomcat 7。我已经按照官方 Tomcat 文档中的建议设置了本机 CORS 过滤。

我已经尽我所能地进行了测试,但还是行不通。鉴于我使用的供应商应用程序我知道正在使用 Spring 安全过滤器,我想知道这里是否存在已知错误。

我要说的是:

<!-- Spring Security START -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>
<!-- Spring Security END -->

我在Web.xml中添加了以下配置:

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

我知道它很小,但应该可以。

我之前也尝试过更长的版本:

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

也没用。

有没有人有使用 Spring 安全设置 CORS 过滤器的经验?

您必须在 web.xml

中的 Spring 安全过滤器之前添加 CORS 过滤器

CORS OPTIONS HTTP 请求不需要由 Spring 安全性

处理

您的供应商应用程序必须启用以使用适当的 CORS header 响应传入的预检选项请求。这不是错误,它只是为 Spring 启用 CORS 时缺少的配置和/或某些代码行。启用 CORS 对您的供应商来说不是什么大事,但对您来说可能会成为一件大事,尤其是当您在 Eclipse 中没有应用程序 java 项目的副本时。

如果幸运的话,您的供应商应用程序已经在 Spring Framework 4.2 RC2 上运行,您可以自己在 XML 中进行配置,请参阅 https://spring.io/blog/2015/06/08/cors-support-in-spring-framework。 只需尝试将 <mvc:cors> 块添加到您的应用程序 web.xml 并根据您的需要配置值。我还没有自己测试过,但它应该可以解决问题。

但我担心你可能没有那么幸运...

如果您不想要求您的供应商更新应用程序/您的 WAR 文件,事情就会变得有点棘手。 在这种情况下,请查看此 post:Can't set Authentication Header with Angular and Spring Security。 post 中的答案描述了需要在您的应用程序 web.xml 中完成的配置(创建一个新的 CORS 过滤器并将其绑定到您已经创建的 class创建) 以及附加 java 过滤器如何 class (在示例中 class 在包 [=13] 中被命名为 SimpleCorsFilter =]) 必须看起来像才能正常工作。要将新的 java class 添加到您的应用程序,您必须解压缩 WAR,创建并添加新的 java 过滤器 class(不要忘记new java class) 中的包声明并重新打包它。这是最复杂的部分,因为如果您在 class 或重新打包过程中犯了错误,您可能会在 re-deployment 之后第一次看到错误。

我可能是错的。但是我见过的每个配置文件的参数名称都与您的不同,也许这就是问题所在,我一直看到和做过的是:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportedMethods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportedHeaders</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.exposedHeaders</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cors.maxAge</param-name>
        <param-value>10</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我有一个类似的配置,关键问题是 Authorization header 在 Tomcat 的 cors.allowed.headers 初始化参数的默认值中是不允许的。所以我只需要像这样添加它:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Authorization,Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
        <!--         ^^^^^^^^^^^^^ -->
    </init-param>
</filter>