我遇到了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存储库,我应该使用哪一个?