Spring Boot Filter не запускается, если удалить @component в классе fitler - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть две конечные точки, / здоровье и / сохранить. Я не хочу вызывать MyFilter для конечной точки / health. Ниже приведен код

@Component
public class MyFilter implements Filter {

    @Autowired
    private JwtConfig jwtConfig;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // do something

        filterChain.doFilter(servletRequest, servletResponse);
    }
}

@Configuration
@Order(2)
public class WebSecurityConfig extends DefaultSecurityConfig {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.cors().and().csrf().disable().addFilterAfter(new MyFilter(), BasicAuthenticationFilter.class)
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        super.configure(webSecurity);
        webSecurity.ignoring().antMatchers("/health/**");
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
        return source;
    }
}

Проблема в том, что, если я удаляю @component из MyFilter, фильтр не вызывается ни для какой конечной точки, а если я помещаю его обратно, он вызывается в обеих конечных точках. Как я могу сделать это применимо только для / конечной точки здоровья?

1 Ответ

1 голос
/ 24 февраля 2020

Только в части // do something, проверьте, является ли запрошенный URL метрикой, и выполняйте свои действия, только если это не так. Информация легко доступна в HttpServletRequest объекте.

Я не уверен, есть ли более прямые способы сделать это. Использование FilterRegistrationBean позволит вам добавлять только URL-адреса для включения, а не URL-адреса для исключения.

Если вы считаете, что у вас будут только эти две конечные точки, вы, конечно, можете использовать FilterRegistrationBean, чтобы добавить только свою конечную точку сохранения:

@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
    FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new MyFilter());
    registrationBean.addUrlPatterns("/save");
    return registrationBean;
}

В этом случае вы можете удалить аннотацию компонента.

...