Bootstrap

Spring Boot 中的过滤器 (Filter) 使用方案

Spring Boot 中的过滤器 (Filter) 使用方案

引言

在 Spring Boot 中,过滤器用于处理请求和响应的过程,可以在请求到达 Servlet 之前和响应返回客户端之前进行一些处理。本文将介绍三种在 Spring Boot 中使用过滤器的方法:使用 @WebFilter、使用 @Component 和使用 FilterRegistrationBean

1. 使用 @WebFilter + @ServletComponentScan

@WebFilter 注解是 Servlet 规范的一部分,可以直接将过滤器与 URL 模式关联。适合简单的过滤需求。

示例代码

下面是通过实现 @WebFilter + @ServletComponentScan来实现过滤器的示例代码:

@WebFilter(urlPatterns = "/*", filterName = "servletFilter")
public class ServletFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {
        System.out.println("this is servlet filter begin");
        filterChain.doFilter(request, response);
        System.out.println("this is servlet filter end");
    }
}

启动类上添加 @ServletComponentScan 注解开启对 @WebFilter 的支持。

@SpringBootApplication
@ServletComponentScan
public class Bootstrap {

    public static void main(String[] args) {
        SpringApplication.run(Bootstrap.class, args);
    }
}

注意事项

  • @Order注解在 @WebFilter 中无效。

2. 使用 @Component + @Order

通过将过滤器类使用 @Component 注解标记为 Spring Bean,并使用 @Order给过滤器排序,我们可以在 Spring Boot 中轻松地注册过滤器。

示例代码

以下是通过 @Compent + @Order 实现过滤器的示例代码:

@Component
@Order(Integer.MIN_VALUE)
public class GlobalFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {
        System.out.println("this is global filter begin");
        filterChain.doFilter(request, response);
        System.out.println("this is global filter end");
    }
}

注意事项

  • 该方式实现的过滤器,会拦截所有URL,不能通过配置去拦截指定的 URL。

3. 使用 FilterRegistrationBean 解决跨域(推荐)

FilterRegistrationBean 提供了更灵活的方式来注册过滤器,适合复杂的过滤需求和细粒度的配置。

示例代码

以下是通过 FilterRegistrationBean 实现过滤器的示例代码:

@Configuration
public class FilterConfig {
    
    @Bean
    public FilterRegistrationBean<Filter> customFilterBean() {
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new CustomFilter());
        bean.setOrder(Integer.MIN_VALUE + 2);
        bean.addUrlPatterns("/*");
        bean.setName("customFilter");
        return bean;
    }
}

public class CustomFilter implements Filter {
  
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {
        System.out.println("this is custom filter begin");
        filterChain.doFilter(request, response);
        System.out.println("this is custom filter end");
    }
}

结论

本文介绍了在 Spring Boot 中使用过滤器的三种方案:使用 WebFilter、使用 @Component 和使用 FilterRegistrationBean。每种方法都有其适用的场景,选择合适的方式可以帮助我们更好地实现请求和响应的处理。

;