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

    }

}