天天看點

Spring Boot 自定義Filter

一、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);
          }
      }                

轉載于:https://www.cnblogs.com/XtsLife/p/11383842.html