Filter Spring中過濾器和攔截器(Interceptor)的區別和聯系

在我們日常的開發中 , 我們經常會用到Filter和Interceptor 。有時同一個功能 。Filter可以做 , Interceptor也可以做 。有時就需要考慮使用哪一個比較好 。這篇文章主要介紹一下,二者的區別和聯系 。希望給大家進行選擇的時候,提供一些幫助
Filter 和 Interceptor 的區別Filter過濾器(Filter)是在請求進入Tomcat容器之后,請求進入Servlet之前執行 。Filter是Servlet規范規定的 , 只能用于web程序中 。
Interceptor攔截器(Interceptor)是在Servlet和Controller控制器之間執行 。Interceptor是SpringframeWork中規定的 。
Filter Spring中過濾器和攔截器(Interceptor)的區別和聯系

文章插圖
  • Interceptor是基于java的反射機制的 , 而Filter是基于函數回調 。
  • Interceptor不依賴與servlet容器 , Filter依賴與servlet容器 。
  • Interceptor只能對action請求起作用 , 而Filter則可以對幾乎所有的請求起作用 。
  • Interceptor可以訪問action上下文、值棧里的對象,而Filter不能訪問 。
  • Interceptor以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯 。攔截器可以獲取ioc中的service bean實現業務邏輯 。
Spring MVC中每個控制器中可以定義多個請求處理方法,我們把這種請求處理方法簡稱為ActionFilter的實現自己的filter需要要實現javax.servlet.Filter.
【Filter Spring中過濾器和攔截器(Interceptor)的區別和聯系】import javax.servlet.*;import java.io.IOException;public class Myfilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Myfilter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Myfilter doFilter before");filterChain.doFilter(servletRequest,servletResponse);System.out.println("Myfilter doFilter after");}@Overridepublic void destroy() {System.out.println("Myfilter destroy");}}注冊Filter在web.xml中
<!-- 注冊過濾器 --><filter><filter-name>myfilter</filter-name><filter-class>com.hardy.config.Myfilter</filter-class></filter><filter-mapping><filter-name>myfilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>Interceptor的實現自己的Interceptor需要要實現org.springframework.web.servlet.HandlerInterceptor.
import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在攔截點(Controller方法處理之前)執行攔截 若返回的是false則中斷執行 反之亦然System.out.println("MyInterceptor preHandle");return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在處理過程中(Controller方法處理完之后DispatcherServlet進行視圖的渲染之前)執行攔截System.out.println("MyInterceptor postHandle");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在DispatcherServlet進行視圖的渲染后 返回前進行攔截System.out.println("MyInterceptor afterCompletion");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}}注冊Interceptor在spring的配置文件中(application.xml)
<!-- 配置攔截器 --><mvc:interceptors><mvc:interceptor><!-- 攔截所有的mvc控制器(Controller) --><mvc:mapping path="/**"/><!-- 放行機制 指定對某個頁面不進行攔截 --><!-- 攔截器只對action起作用 因此填入的不是頁面路徑 而是方法 --><mvc:exclude-mapping path="/login"/><!-- 指定使用哪個攔截器 --><bean class="com.hardy.config.MyInterceptor"/></mvc:interceptor></mvc:interceptors>

    推薦閱讀