Spring Boot 和 CORS

Posted

技术标签:

【中文标题】Spring Boot 和 CORS【英文标题】:Spring Boot and CORS 【发布时间】:2016-05-04 06:26:28 【问题描述】:

我在 Spring Boot 中遇到了 CORS 问题。我已经像这样配置了CORS

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter 

    @Override
    public void addCorsMappings(CorsRegistry registry) 
        registry.addMapping("/**");
    

我想这会启用所有标题和其他内容。

它非常适合 GET 请求

 $.get("someUrl, function(data, status)
     console.log(data[0].latitude);
 );

但是每当我发出这样的 POST 请求时

 $.ajax(
        url: 'someUrl',
        type: 'post',
        dataType: 'json',
        crossDomain: true,
        contentType: "application/json; charset=utf-8",
        success: function (data) 
            console.log(data);
        ,
        data: object
    );

我得到以下信息

OPTIONS XHR  "someUrl" [HTTP/1.1 403 Forbidden 4ms]
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at  "someUrl". 
(Reason: CORS header 'Access-Control-Allow-Origin' missing).

我该如何解决这个问题?

【问题讨论】:

无论是什么导致了问题,我认为它不在您在问题中发布的 sn-ps 范围内。我刚刚在一个新的 Spring Boot (1.3.2.) 设置上尝试了它,代码量最少,并且当我从其他域POST 时正确添加了 CORS 标头。您使用的是哪个版本的 Boot,您的请求来自哪个用户代理 POST?您的项目中的其他依赖项是否会覆盖您的 Cors 设置(或者可能是控制器上更明确的配置?)? 我使用 Spring Boot 1.3.0.RELEASE 并且用户代理是 Firefox。实际上,它是重定向到其他 Spring Boot 应用程序的其他端点的 Api-gateway 应用程序。我使用的是 netflix 的 Zuul。 【参考方案1】:

使用 Spring Boot 应用程序配置 CORS 过滤器的简单方法是创建实现 Filter@Component 类,如下所示:

@Component
public class SimpleCORSFilter implements Filter 

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        response.setHeader("Access-Control-Expose-Headers", "Location");
        chain.doFilter(req, res);
    

    @Override
    public void init(FilterConfig filterConfig) 

    @Override
    public void destroy() 


spring-boot 1.3.0

配合使用效果很好

编辑(2017 年 10 月):

仍然适用于 spring-boot 1.5.8

【讨论】:

如果你使用的是http基本认证,别忘了在Access-Control-Allow-Headers中添加令牌Authorization 这里实现的Filterjavax.servlet.Filter

以上是关于Spring Boot 和 CORS的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot-starter-web 和 spring-boot-starter-webflux 不能一起工作吗?

Spring Boot系列 Spring Boot介绍和基础POM文件

Spring Boot:Spring Boot整合Logback和PageHelper

spring-boot-starter-jta-atomikos 和 spring-boot-starter-batch

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

Spring boot 梳理 - Spring Boot 属性配置和使用(转)