• 过滤器 Filter
    • 实现 javax.servlet.Filter 接口
    • 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁
      • Filter的生命周期由WEB服务器负责
    • 可以对请求的URL进行过滤, 对敏感词过滤
    • 挡在拦截器的外层
    • Filter 是 Servlet 规范的一部分
  • 拦截器 Interceptor
    • 实现 org.springframework.web.servlet.HandlerInterceptor 接口
    • 不依赖Spring容器, 可以使用 Spring 容器管理的Bean
    • 拦截器通过动态代理进行
    • 拦截器应用场景, 性能分析, 权限检查, 日志记录
  • 监听器 Listener
    • 实现接口
      • javax.servlet.ServletRequestListener, javax.servlet.http.HttpSessionListener
      • javax.servlet.ServletContextListener
      • 等等
    • 主要用来监听对象的创建与销毁的发生,
      • session 的创建销毁,
      • request 的创建销毁,
      • ServletContext 创建销毁

        执行顺序

        SpringBoot过滤器,拦截器,监听器 - 图1

        过滤器

        执行顺序

        SpringBoot过滤器,拦截器,监听器 - 图2

        配置过滤器的三种方式

        配置方式一:可指定过滤路径

  1. 启动类添加注解 @ServletComponentScan 注解
    1. 使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册
      1. @WebFilter时Servlet3.0新增注解,原先实现过滤器,需要在web.xml中进行配置,而现在通过此注解,启动时会自动扫描自动注册
  2. 编写过滤器类实现 Filter 接口

    1. 类名上添加 @WebFilter 注解, // 指定过滤的URL
    2. 类名上添加 @Order(n) 注解,指定过滤器的执行顺序

      启动类

      1. @SpringBootApplication
      2. @ServletComponentScan // 扫描 Servlet 相关的组件
      3. public class SpringBootFilterApplication {
      4. public static void main(String[] args) {
      5. SpringApplication.run(SpringBootFilterApplication.class, args);
      6. }
      7. }

      过滤器类

      1. @Order(1) // 指定过滤器的执行顺序
      2. @WebFilter(filterName = "CostTimeFilter", urlPatterns = "/*" , initParams = {
      3. @WebInitParam(name = "URL", value = "http://localhost:8080")}) // 指定过滤的URL
      4. public class CostTimeFilter implements Filter {
      5. private String url;
      6. /**
      7. * filter对象只会创建一次,init方法也只会执行一次。
      8. */
      9. @Override
      10. public void init(FilterConfig filterConfig) throws ServletException {
      11. this.url = filterConfig.getInitParameter("URL");
      12. System.out.println("Filter init...");
      13. }
      14. /**
      15. * 主要的业务代码编写方法
      16. */
      17. @Override
      18. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      19. long start = System.currentTimeMillis();
      20. System.out.println(start + " Filter doFilter before...");
      21. filterChain.doFilter(servletRequest, servletResponse);
      22. long end = System.currentTimeMillis();
      23. System.out.println(end + "Filter doFilter after...");
      24. }
      25. /**
      26. * 在销毁Filter时自动调用。
      27. */
      28. @Override
      29. public void destroy() {
      30. System.out.println("Filter destroy...");
      31. }
      32. }

      配置方式二:只能过滤所有路径

  3. 编写过滤器类实现 Filter 接口

    1. 类名上添加 @Component 或 @Configuration 接口(推荐使用@Component)

      备注:如果添加了@Component 或 @Configuration,又添加了 @WebFilter(),那么会初始化两次Filter,并且会过滤所有路径+自己指定的路径 ,便会出现对没有指定的URL也会进行过滤

配置方式三:可过滤指定路径

  1. 编写过滤器类实现 Filter 接口
  2. 编写过滤器注册类

    1. 类名上添加 @Configuration 注解
    2. 方法名上添加 @Bean 注解

      过滤器类

      1. public class CostTimeFilter implements Filter {
      2. private String url;
      3. /**
      4. * filter对象只会创建一次,init方法也只会执行一次。
      5. */
      6. @Override
      7. public void init(FilterConfig filterConfig) throws ServletException {
      8. this.url = filterConfig.getInitParameter("URL");
      9. System.out.println("Filter init...");
      10. }
      11. /**
      12. * 主要的业务代码编写方法
      13. */
      14. @Override
      15. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      16. filterChain.doFilter(servletRequest, servletResponse);
      17. }
      18. /**
      19. * 在销毁Filter时自动调用。
      20. */
      21. @Override
      22. public void destroy() {
      23. System.out.println("Filter destroy...");
      24. }
      25. }

      注册过滤器

      1. @Configuration
      2. public class FilterConfig {
      3. @Bean
      4. // @Order(2)
      5. public FilterRegistrationBean registFilter() {
      6. FilterRegistrationBean registration = new FilterRegistrationBean();
      7. registration.setFilter(new CostTimeFilter());
      8. registration.addUrlPatterns("/*");
      9. registration.setName("CostTimeFilter");
      10. registration.setOrder(1);
      11. return registration;
      12. }
      13. }