一、添加依赖
<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
查看控制台打印的结果: