过滤器注册后,CORS停止工作

时间:2020-05-25 21:10:40

标签: java spring-boot spring-mvc

我有一个全局的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标头必须位于每个响应中,而不仅应位于OPTIONSCORS HEADERS present only on preflight or every request

0 个答案:

没有答案