Spring Data Rest CORS过滤器技术差异

时间:2016-10-13 21:19:58

标签: java spring spring-mvc spring-data spring-data-rest

我遇到了CORS的问题,看起来似乎是预检问题。原始问题描述为here

我遇到了几种不同的方法,但我不确定3种不同方法之间的技术差异以及它们为什么会起作用或不起作用。

方法1:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("**")
            .allowedOrigins("*")
            .allowedMethods("GET", "PUT", "DELETE", "OPTIONS", "POST")
            .allowedHeaders("*")
            .allowCredentials(false).maxAge(3600);
    }
}

方法2:

@Configuration
public class MyConfiguration {

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }
}

方法3:

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class CORSFilter implements Filter {

    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");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

我的一般新手理解是方法1是一种“较旧”的方式(例如在4.2之前,我使用的是4.2.5)。这个方法似乎不适用于我的CrudRepositories(这是有道理的)。方法2是在4.2中添加的更新版本,并添加了对处理Spring Data Rest存储库的支持?方法3是直接使用应用程序服务器(Tomecat的)头文件?

方法1和2对我不起作用。方法1不会启用任何CORS请求。方法2允许GET,但没有预先发出的请求。方法3似乎与GET和预先发出的请求一起使用。如果我的理解是正确的,我可以理解为什么方法1不起作用,但我不明白为什么方法2不能用于预检请求,或者我怎么能使它工作。我为方法2添加了一个catch,所以一切都应该通过。

那么,技术差异是什么?如果我使用Spring Data Rest存储库,我应该使用哪一个?

0 个答案:

没有答案