Spring Boot和CORS

nur*_*tey 8 cors spring-boot

我在春季启动时面临CORS问题.我已经像这样配置了CORS

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这可以启用所有标题和其他内容.

它与GET请求一起出色地工作

 $.get("someUrl, function(data, status){
     console.log(data[0].latitude);
 });
Run Code Online (Sandbox Code Playgroud)

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

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

我得到以下内容

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).
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Iva*_*cki 21

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

@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() {}

}
Run Code Online (Sandbox Code Playgroud)

它非常适合 spring-boot 1.3.0

编辑(2017年10月):

仍然可以使用 spring-boot 1.5.8

  • 这里实现的`Filter`是`javax.servlet.Filter` (3认同)