支持CORS的Spring Rest实现 - 多个请求的问题(对预检请求的响应没有通过访问控制检查)

时间:2016-03-14 12:20:07

标签: spring-mvc spring-security cors spring-restcontroller spring-rest

我正面临着对Spring Rest Implementation的CORS支持的问题。 奇怪的是,我可以使用Rest API成功登录但登录后,获取异常as-

  

对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' http://localhost:8100'因此不允许访问。响应的HTTP状态代码为401。

我使用的代码片段如下 -

配置类 -

  @Bean
  public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new CorsInterceptor());
    }
   };
 }

CorsInterceptor类 -

public class CorsInterceptor extends HandlerInterceptorAdapter {

 public static final String CREDENTIALS_NAME = "Access-Control-Allow-Credentials";
 public static final String ORIGIN_NAME = "Access-Control-Allow-Origin";
 public static final String METHODS_NAME = "Access-Control-Allow-Methods";
 public static final String HEADERS_NAME = "Access-Control-Allow-Headers";
 public static final String MAX_AGE_NAME = "Access-Control-Max-Age";

 static final String ORIGIN = "Origin";

 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  String origin = request.getHeader(ORIGIN);
  response.addHeader(ORIGIN_NAME, origin);
  response.setHeader(CREDENTIALS_NAME, "true");
  response.setHeader(METHODS_NAME, "GET, POST, PUT, OPTIONS, DELETE");
  response.setHeader(HEADERS_NAME,
        "Authorization, Accept-Encoding,Cache-Control, Connection, Content-Length, Cookie,Host, If-Modified-Since, Pragma, User-Agent,Content-Type");
  response.setHeader(MAX_AGE_NAME, "3600");

  if (request.getMethod().equals("OPTIONS")) {
    response.setStatus(HttpServletResponse.SC_ACCEPTED);
  }

  return true;
}

在这里,我能够登录成功,(第一次预检请求然后是实际请求,两者都正常工作)。 在此之后我调用了POST请求(第一个预检请求被调用),但是它给了我例外 -

  

对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' http://localhost:8100'因此不允许访问。响应的HTTP状态代码为401。

我尝试使用 CorsConfiguration 以及 CorsRegistry 作为 -

registry.addMapping("/**").allowedOrigins("*")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("")
            .allowCredentials(true).maxAge(3600);

但没有运气。

让我知道如果我在这里遗漏了什么。

感谢。

1 个答案:

答案 0 :(得分:0)

您应该使用过滤器而不是拦截器并尝试将response.addHeader(ORIGIN_NAME, origin);更改为response.addHeader(ORIGIN_NAME, "*");