У меня есть глобальный конфигуратор 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.
UPDATE # 1:
I решил мою проблему, добавив:
if (httpReq.getMethod().equals("OPTIONS"))
{
next.doFilter(req, res);
return;
}
в самое начало моих фильтров. Не уверен, что это правильный подход.
ОБНОВЛЕНИЕ # 2:
Приведенное выше решение неверно, заголовки CORS должны быть на каждый ответ, а не только на OPTIONS
, Заголовки CORS присутствуют только при предпечатной проверке или при каждом запросе