我有一个非常简单的例子,但我无法让它工作。
我有一个模拟数据库的域和我的存储库。
public interface MyTestRepository extends CrudRepository<MyTest, Integer> {
}
我使用http://resttesttest.com/进行测试。GET方法返回JSON REST信息没有问题。
我可以查询端点http://localhost:8080/mytest/1,并从数据库中获取id = 1的信息。
然而,当我尝试使用DELETE选项时出现问题。如果我在http://localhost:8080/mytest/1上运行DELETE,则会得到以下错误:
响应预检请求未通过访问控制检查:所请求的资源上没有“Access-Control-Allow-Origin”标头。因此,源'http://resttesttest.com'被拒绝访问。该响应的HTTP状态码为403。
我最初尝试了下面的方法,但发现不能使用它,因为我使用的是Spring-data-Rest。https://jira.spring.io/browse/DATAREST-573
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true).maxAge(3600);
}
我在谷歌上搜索到了这篇文章。 如何在Spring Boot + Spring Security应用程序中配置CORS? 于是我添加了:
@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;
}
我还找到了这个帖子:
我也尝试过下面的代码,但没有成功。
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
// return new CorsFilter(source);
final FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
我在测试中添加了一个“catch all”来允许所有的CORS通过,但是即使我使用了“*”,我仍然收到“No 'Access-Control-Allow-Origin'”错误。
此时,我不知道我缺少什么,导致预检请求无法通过访问控制检查。
curl在发出删除请求时没有任何问题。
编辑:
最终找到了确切的解决方法。我不确定我现有的方法和这种方法之间的区别,但这似乎有效。
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Note this is a very simple CORS filter that is wide open.
* This would need to be locked down.
* Source: https://dev59.com/XJrga4cB1Zd3GeqPtd8W
*/
@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() {}
}