Filter 作用
Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理。
Filter 流程图
1. 用户发起请求被Filter链拦截
2. Filter1 放行后要经过 Filter2
3. Filter2 放行后要经过 Filter3
4. Filter3 放行后才来到了 Controller 对请求进行处理
5. Controller 处理完毕后又要经过 Filter3 放行后的后续操作
6. Filter3 放行后的后续操作处理完成后经过 Filter2 放行后的后续操作
7. Filter2 放行后的后续操作处理完成后经过 Filter1 放行后的后续操作
8. Filter1 放行后的后续操作处理完成将结果返回给用户
Filter 用法
实际工作中,我们都是使用 SpringBoot 进行业务开发,现总结三种 Filter 用法,SpringBoot 版本采用目前最新的 v2.3.1.RELEASE
- @Component + @Order 方式 通过实现过滤器接口并交给spring管理
@Component
@Order(1)
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FirstFilter init .......");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FirstFilter doFilter .......");
// 要继续处理请求,必须添加 filterChain.doFilter()
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("FirstFilter destroy .......");
}
}
ps: order值越小越先执行
总结: 默认对所有的URL进行过滤,不能通过配置去过滤指定的URL
- @WebFilter + @ServletComponentScan 方式 通过 @webFilter 配置过滤指定的URL, @ServletComponentScan 来指定去哪里扫描 Filter
@WebFilter(urlPatterns = "/*")
public class SecondFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("SecondFilter init .......");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("SecondFilter doFilter .......");
// 要继续处理请求,必须添加 filterChain.doFilter()
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("SecondFilter destroy .......");
}
}
@SpringBootApplication
@ServletComponentScan("xxx.xxx.filter")
public class ExperimentApplication {
public static void main(String[] args) {
SpringApplication.run(ExperimentApplication.class, args);
}
}
总结: 不能指定过滤器执行顺序
- JavaConfig 配置方式
@Configuration
public class FiltersConfig {
@Bean
public FilterRegistrationBean registerFirstFilter(){
FilterRegistrationBean<FirstFilter> bean = new FilterRegistrationBean<>();
bean.setOrder(1);
bean.setFilter(new FirstFilter());
// 匹配"/hello/"下面的所有url
bean.addUrlPatterns("/hello/*");
return bean;
}
@Bean
public FilterRegistrationBean registerSecondFilter(){
FilterRegistrationBean<ThreeFilter> bean = new FilterRegistrationBean<>();
bean.setOrder(3);
bean.setFilter(new ThreeFilter());
// 匹配"/hello/"下面的所有url
bean.addUrlPatterns("/test/*");
return bean;
}
}
总结: 既可以指定过滤器的执行顺序还能够指定配置去过滤指定的 URL