SpringBoot项目中filter的两种使用详解
作者:0和1搭建网络世界
文章介绍了两种方式在Spring Boot中创建和配置过滤器:使用`@WebFilter`注解和`@ServletComponentScan`注解,以及通过`@Bean`注解自定义过滤器并加载到IOC容器,通过测试启动项目并访问指定URL,可以查看控制台打印的过滤器执行顺序结果
一、添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
二、@WebFilter方式
@WebFilter(filterName = "myFilter",urlPatterns = "/*")
@Slf4j
@Order(value = 2) //存在多个filter时 指定filter执行顺序
public class MyFilter02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("=======过滤器初始化2=======");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
log.info("过滤器2:请求的sessionID为{},请求的url为{}",httpServletRequest.getSession().getId(),httpServletRequest.getRequestURL());
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
@SpringBootApplication
@ServletComponentScan
public class SpringBootFiltrApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootFiltrApplication.class,args);
}
}
启动类中@ServletComponentScan注解和@WebFilter注解配合使用,@ServletComponentScan注解会自动扫描带有@WebFilter注解的类
三、@Bean注解方式
先自定义一个过滤器:
@Slf4j
public class MyFilter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("=====初始化过滤器1======");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
log.info("过滤器1:请求路径:{}",httpServletRequest.getRequestURL());
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
将自定义的过滤器加载到ioc容器中
@Configuration
public class AddFilters {
@Bean
public FilterRegistrationBean addFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter01());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
上面可以看出,通过两种方式分别创建了filter01和filter02两个过滤器,并分别指定了他们执行的顺序
三、测试
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/getUserInfo")
public String getUserInfo(){
return "获取成功";
}
}
启动项目:访问http://localhost:8080/user/getUserInfo
查看控制台打印的结果:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
