1. 程式人生 > 其它 >Java中過濾器(Filter) 和 攔截器 (Intercepter) 的使用

Java中過濾器(Filter) 和 攔截器 (Intercepter) 的使用

1.過濾器(Filter)

過濾器的配置比較簡單,直接實現Filter 介面即可,也可以通過@WebFilter註解實現對特定URL攔截,看到Filter 介面中定義了三個方法。

  • init() :該方法在容器啟動初始化過濾器時被呼叫,它在 Filter 的整個生命週期只會被呼叫一次。注意:這個方法必須執行成功,否則過濾器會不起作用。
  • doFilter() :容器中的每一次請求都會呼叫該方法, FilterChain 用來呼叫下一個過濾器 Filter。
  • destroy(): 當容器銷燬 過濾器例項時呼叫該方法,一般在方法中銷燬或關閉資源,在過濾器 Filter 的整個生命週期也只會被呼叫一次

@Component
public class MyFilter implements Filter {
          @Override
           public void init(FilterConfig filterConfig) throws ServletException {

           System.out.println("Filter 前置");
}

           @Override
           public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

           System.out.println("Filter 處理中");
           filterChain.doFilter(servletRequest, servletResponse);
}

          @Override
          public void destroy() {

          System.out.println("Filter 後置");
}
}

2.攔截器(Interceptor)

攔截器它是鏈式呼叫,一個應用中可以同時存在多個攔截器Interceptor, 一個請求也可以觸發多個攔截器 ,而每個攔截器的呼叫會依據它的宣告順序依次執行。首先編寫一個簡單的攔截器處理類,請求的攔截是通過HandlerInterceptor 來實現,看到HandlerInterceptor 介面中也定義了三個方法。

  • preHandle() :這個方法將在請求處理之前進行呼叫。注意:如果該方法的返回值為false ,將視為當前請求結束,不僅自身的攔截器會失效,還會導致其他的攔截器也不再執行。
  • postHandle():只有在 preHandle() 方法返回值為true 時才會執行。會在Controller 中的方法呼叫之後,DispatcherServlet 返回渲染檢視之前被呼叫。 有意思的是:postHandle() 方法被呼叫的順序跟 preHandle() 是相反的,先宣告的攔截器 preHandle() 方法先執行,而postHandle()方法反而會後執行。
  • afterCompletion():只有在 preHandle() 方法返回值為true 時才會執行。在整個請求結束之後, DispatcherServlet 渲染了對應的檢視之後執行。
 

搜尋

複製