我正面临着对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);
但没有运气。
让我知道如果我在这里遗漏了什么。
感谢。
答案 0 :(得分:0)
您应该使用过滤器而不是拦截器并尝试将response.addHeader(ORIGIN_NAME, origin);
更改为response.addHeader(ORIGIN_NAME, "*");