Spring Boot 攔截器和過濾器

Spring Boot 攔截器和過濾器

文章概覽

  • 攔截器
  • 過濾器

攔截器


我們可以使用攔截器做一些處理在一下兩種狀態:

  • 發送請求到controller之前
  • 響應信息到客戶端之前

攔截器步驟:

  • 定義一個攔截器
  • 註冊定義的攔截器

例子:在一個請求在到達controller之前,我們可以用攔截器給這個請求增加request header 的屬性;或在一個響應返回到客戶端之前,我們用攔截器給這個響應增加response header。

自定義攔截器,需要我們實現HandlerInterceptor接口,還要 @Component 註解的支持。

下面是三個方法來自HandlerInterceptor接口

  • preHandle():該方法用來做一些處理,在請求到達controller之前。返回true時,纔會返回響應給客戶端。
  • postHandle():該方法用來做一些處理,在響應到達客戶端之前。
  • afterCompletion():該方法做一些處理,在完成請求和響應後。

代碼如下:

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("pre Handle method is Calling");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Post Handle method is Calling");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Request and Response is completed");
    }
}

註冊攔截器,我們需要InterceptorRegistry 來註冊攔截器,要實現WebMvcConfigurer 接口

@Component
public class ProductServiceInterceptorAppConfig implements WebMvcConfigurer {
    @Autowired
    ProductServiceInterceptor productServiceInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(productServiceInterceptor);
    }
}

攔截器執行大概流程如下:
在這裏插入圖片描述

過濾器


過濾器用來攔截HTTP的請求和響應,我們可以使用過濾器處理一些操作:

  • 在請求到達controller之前
  • 在響應到達client之前

自定義一個過濾器(Filter),需要實現Filter接口,需要 @Component支持。Filter的三個方法:

  • init():在初始化過濾器的時候就執行
  • doFilter():可能會到過濾器,調用過濾器執行鏈。
  • destroy():在銷燬過濾器時執行

代碼如下

@Component
public class SimpleFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter start init");
    }

    @Override
    public void destroy() {
        System.out.println("filter end!!!");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Remote Host:"+servletRequest.getRemoteHost());
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("Remote1 Host:"+servletRequest.getRemoteHost());
    }
}

過濾器的執行大概流程:
在這裏插入圖片描述

攔截器和過濾器的區別

  • 過濾器能做的,攔截器能做
  • 他們執行順序不一致
    在這裏插入圖片描述

參考

Spring Boot - Interceptor

發佈了7 篇原創文章 · 獲贊 2 · 訪問量 749
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章