我有一个全局的cors配置器:
@Bean
public WebMvcConfigurer corsConfigurer()
{
return new WebMvcConfigurer()
{
@Override
public void addCorsMappings(CorsRegistry registry)
{
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins(...);
}
};
}
问题是,一旦我添加了过滤器:
@Bean
FilterRegistrationBean<SomeFilter> someFilter()
{
FilterRegistrationBean<SomeFilter> someFilter = new FilterRegistrationBean<>();
someFilter.setFilter(new SomeFilter());
someFilter.addUrlPatterns("/*");
return someFilter;
}
private static class SomeFilter implements Filter
{
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain next) throws IOException, ServletException
{
HttpServletRequest httpReq = (HttpServletRequest) req;
String test = httpReq.getHeader("test");
if (test == null || !test.equals("ok"))
{
HttpServletResponse httpRes = (HttpServletResponse) res;
httpRes.setStatus(403);
return;
}
next.doFilter(req, res);
}
}
CORS停止工作。我想发生这种情况是因为我的过滤器在添加CORS标头之前返回了请求。
更新#1:
我通过添加以下内容解决了我的问题:
if (httpReq.getMethod().equals("OPTIONS"))
{
next.doFilter(req, res);
return;
}
到我的过滤器的开始。不确定这是否是正确的方法。
更新#2:
以上解决方案是错误的,CORS标头必须位于每个响应中,而不仅应位于OPTIONS
,CORS HEADERS present only on preflight or every request