Spring-Boot-Jersey 设置 CORS
Spring-Boot-Jersey Setup CORS
我从两台不同的服务器为我的前端和后端提供服务。现在我正在尝试让 CORS 在 Spring-Boot-Jersey 后端上工作。我尝试了在互联网上可以找到的所有方法,但似乎没有任何效果,或者我遗漏了一些东西。
我当前的设置使用 ContainerResponseFilter
。我尝试使用 @Provider
自动注册它,并在 Jersey 配置中手动注册它。
容器响应过滤器
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request,
ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
也许这很重要,但我还通过添加 @EnableOAuth2Sso
注释来使用 Spring-Security-oauth2
。如果您需要我的更多设置,请告诉我。
不确定 Spring 是否支持 @Provider 注释。尝试用 Springs @Component 替换 @Provider 注释,CORSFilter 应该扩展 org.springframework.web.filter.OncePerRequestFilter
。这是配置过滤器的 Spring 方法,适用于任何应用程序服务器。
您还可以通过 WebMvcConfigurerAdapter 配置 CORS,这可能更紧凑:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("...") // add headers
.allowedMethods(".."); // add methods
}
};
}
查看this指南!
使用 https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii
中显示的 CORSFilter 修复了它
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class CorsFilter implements Filter {
void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response.setHeader("Access-Control-Max-Age", "3600");
if (request.getMethod()!='OPTIONS') {
chain.doFilter(req, res);
} else {
}
}
void init(FilterConfig filterConfig) {}
void destroy() {}
}
我是这样修复的,
首先创建一个class
public class CORSResponseFilter implements ContainerResponseFilter {
public void filter(ContainerRequestContext requestContext,ContainerResponseContext responseContext)
throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
//headers.add("Access-Control-Allow-Origin", "http://abcd.org"); //allows CORS requests only coming from abcd.org
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
}
}
过滤器必须继承自 ContainerResponseFilter 接口并且必须注册为提供者:
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(CORSResponseFilter.class);
//other registrations
}
}
我从两台不同的服务器为我的前端和后端提供服务。现在我正在尝试让 CORS 在 Spring-Boot-Jersey 后端上工作。我尝试了在互联网上可以找到的所有方法,但似乎没有任何效果,或者我遗漏了一些东西。
我当前的设置使用 ContainerResponseFilter
。我尝试使用 @Provider
自动注册它,并在 Jersey 配置中手动注册它。
容器响应过滤器
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request,
ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
也许这很重要,但我还通过添加 @EnableOAuth2Sso
注释来使用 Spring-Security-oauth2
。如果您需要我的更多设置,请告诉我。
不确定 Spring 是否支持 @Provider 注释。尝试用 Springs @Component 替换 @Provider 注释,CORSFilter 应该扩展 org.springframework.web.filter.OncePerRequestFilter
。这是配置过滤器的 Spring 方法,适用于任何应用程序服务器。
您还可以通过 WebMvcConfigurerAdapter 配置 CORS,这可能更紧凑:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("...") // add headers
.allowedMethods(".."); // add methods
}
};
}
查看this指南!
使用 https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii
中显示的 CORSFilter 修复了它@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class CorsFilter implements Filter {
void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response.setHeader("Access-Control-Max-Age", "3600");
if (request.getMethod()!='OPTIONS') {
chain.doFilter(req, res);
} else {
}
}
void init(FilterConfig filterConfig) {}
void destroy() {}
}
我是这样修复的, 首先创建一个class
public class CORSResponseFilter implements ContainerResponseFilter {
public void filter(ContainerRequestContext requestContext,ContainerResponseContext responseContext)
throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
//headers.add("Access-Control-Allow-Origin", "http://abcd.org"); //allows CORS requests only coming from abcd.org
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
}
}
过滤器必须继承自 ContainerResponseFilter 接口并且必须注册为提供者:
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(CORSResponseFilter.class);
//other registrations
}
}