使用 Spring MVC 为所有 API 启用 CORS

Posted

技术标签:

【中文标题】使用 Spring MVC 为所有 API 启用 CORS【英文标题】:Enable CORS for all APIs with Spring MVC 【发布时间】:2014-09-11 17:47:09 【问题描述】:

如何“轻松”配置 Spring MVC,以便对我应用程序中任何 API 的每个请求都返回神奇的 CORS 标头?

例如,使用@ControllerAdvice 或使用常见的 AOP 建议。

【问题讨论】:

你看过了吗:spring.io/guides/gs/rest-service-cors 使用Tomcat的CORS过滤器tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter 【参考方案1】:

我通过以下步骤解决:

    添加 Maven 依赖项
<dependency>
  <groupId>com.thetransactioncompany</groupId>
  <artifactId>cors-filter</artifactId>
  <version>2.2.1</version>
</dependency>

    在 web.xml 中添加这个参数

    <filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    
    <init-param>
        <param-name>cors.allowGenericHttpRequests</param-name>
        <param-value>true</param-value>
    </init-param>
    
    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>
    
    <init-param>
        <param-name>cors.allowSubdomains</param-name>
        <param-value>false</param-value>
    </init-param>
    
    <init-param>
        <param-name>cors.supportedMethods</param-name>
        <param-value>GET, HEAD, POST, DELETE, OPTIONS</param-value>
    </init-param>
    
    <init-param>
        <param-name>cors.supportedHeaders</param-name>
        <param-value>*</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>3600</param-value>
    </init-param>   
    </filter>
    

【讨论】:

【参考方案2】:

其中一种方法是使用 Interceptor 类,如下所示:

为了代码简洁,我没有实现 while 拦截器设置。

让我们为所有 URL 设置拦截器方法,如下所示:

 public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler)
        throws Exception 

       request.setHeader(HttpHeaders.CONTENT_TYPE, "application/jsonp");    

       //OR

       response.addHeader(HttpHeaders.CONTENT_TYPE, "application/jsonp");
       response.setHeader("Access-Control-Allow-Origin", "*");
       response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
       response.setHeader("Access-Control-Max-Age", "3600");
       response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

我们只需要配置拦截器来满足 Controller 方法的需要。

JSONP 是 CORS 通信的首选格式之一。

【讨论】:

以上是关于使用 Spring MVC 为所有 API 启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC Web 应用程序 - 从属性启用/禁用控制器

如何在spring mvc中启用ZuulProxy

如何在 REST API 中使用带有 spring mvc 的版本?

如何在 Spring MVC 中为错误响应启用 CORS?

如何在Spring MVC中基于http请求头启用json的动态漂亮打印?

将 GZIP 压缩与 Spring Boot/MVC/JavaConfig 与 RESTful 结合使用