首页 > 技术文章 > Spring Boot 自定义Filter

XtsLife 2019-08-20 16:39 原文

一、Filter功能

它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个 “servlet chaining” (servlet 链).

一个Filter包括:
1)、在servlet被调用之前截获;
2)、在servlet被调用之前检查servlet request;
3)、根据需要修改request头和request数据;
4)、根据需要修改response头和response数据;
5)、在servlet被调用之后截获.

二、自定义Filter

  • 方法一:
  1. 实现filter方法

    public class GlobalFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            String requestURI = request.getRequestURI();
            System.out.println(requestURI);
            filterChain.doFilter(request, servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
  2. 加载Filter 配置

    @Configuration
    public class FilterConfig {
    
        @Bean
        public FilterRegistrationBean filterRegistration(){
            // 新建过滤器注册类
            FilterRegistrationBean registration = new FilterRegistrationBean();
            // 添加自定义 过滤器
            registration.setFilter(globalFilter());
            // 设置过滤器的URL模式
            registration.addUrlPatterns("/*");
            //设置过滤器顺序
            registration.setOrder(1);
            return registration;
        }
        @Bean
        public GlobalFilter globalFilter(){
            return new GlobalFilter();
        }
    }	
    
  • 方法二(推荐)

    1. 自定义MyFilter, 如果请求URI 包含 my , 则进行下一步处理

      @WebFilter(filterName = "myFilter", urlPatterns = "/*")
      public class MyFilter implements Filter {
      
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("init...");
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              HttpServletRequest request = (HttpServletRequest) servletRequest;
              String requestURI = request.getRequestURI();
              if(requestURI.contains("my")){
                  System.out.println("成功啦。。。, 请求URI是:" + requestURI);
              }
              filterChain.doFilter(request, servletResponse);
          }
      
          @Override
          public void destroy() {
              System.out.println("destroy...");
          }
      }
      
    2. 在Application 启动类 添加 @ServletComponentScan 注解

      @ServletComponentScan
      @SpringBootApplication
      public class Application {
      
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
      }
      

推荐阅读