如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器
Posted
技术标签:
【中文标题】如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器【英文标题】:Spring Boot Filter is not getting invoked if remove @component in filter class 【发布时间】:2020-06-08 00:14:00 【问题描述】:我有两个端点,/health 和 /save。我不想为 /health 端点调用 MyFilter。 下面是代码
@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;
问题是如果我从 MyFilter 中删除 @component,过滤器不会被任何端点调用,如果我把它放回去,它会在两个端点中调用。如何使其仅适用于 /health 端点?
【问题讨论】:
定义一个@Bean
方法返回您的过滤器(而不是使用 @Component
)并添加一个额外的 FilterRegistrationBean
来选择应该反应的 URL。如果这需要成为 Spring Security 过滤器链的一部分,请检查过滤器内的 URL 并决定是否需要做一件事或其他。
【参考方案1】:
就在// do something
部分,检查请求的网址是否是指标,如果不是,则仅执行您的操作。该信息在HttpServletRequest
对象中很容易获得。
我不确定是否有更直接的方法可以做到这一点。使用 FilterRegistrationBean 将只允许您添加要包含的 url,而不是要排除的 url。
如果你认为你只会有这两个端点,你当然可以使用 FilterRegistrationBean 只添加你的保存端点:
@Bean
public FilterRegistrationBean<MyFilter> myFilter()
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/save");
return registrationBean;
在这种情况下,您可以删除 Component 注释。
【讨论】:
谢谢。但是将来除了 /save 之外还会有更多的端点。所以我们需要把所有东西都添加到这里吗? @sagarkancherla 你读过我回答的第一部分吗? “就在 // 做某事部分,检查请求的 url 是否是指标,如果不是,则仅执行您的操作。信息在 HttpServletRequest 对象中很容易获得。”。以上是关于如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
搜索之后,p:dataTable将不会更新,除非调用两次搜索或者输入和清除过滤器中的某些内容