天天看點

SpringMVC攔截器【監聽器、過濾器、攔截器的執行過程和對比】SpringMVC攔截器

SpringMVC攔截器

1、監聽器、過濾器和攔截器對比

Servlet:處理Request請求和Response響應

  1. 過濾器(Filter):對Request請求起到過濾的作用,作用在Servlet之前,如果配置為/*可以對所 有的資源通路(servlet、js/css靜态資源等)進⾏過濾處理
  2. 監聽器(Listener):實作了javax.servlet.ServletContextListener 接口的伺服器端元件,它随 Web應用的啟動而啟動,隻初始化⼀次,然後會⼀直運⾏監視,随Web應用的停止而銷毀
  • 作用⼀:做⼀些初始化工作,web應用中spring容器啟動ContextLoaderListener
  • 作用⼆:監聽web中的特定事件,比如HttpSession,ServletRequest的建立和銷毀;變量的建立、 銷毀和修改等。可以在某些動作前後增加處理,實作監控,停止比如統計線上⼈數,利用 HttpSessionLisener等。
  1. 攔截器(Interceptor):是SpringMVC、Struts等表現層架構自己的,不會攔截 jsp/html/css/image的通路等,隻會攔截通路的控制器方法(Handler)。

從配置的角度也能夠總結發現:serlvet、filter、listener是配置在web.xml中的,而interceptor是 配置在表現層架構自己的配置檔案中的

  • 在Handler業務邏輯執行之前攔截⼀次
  • 在Handler邏輯執行完畢但未跳轉頁面之前攔截⼀次
  • 在跳轉頁面之後攔截⼀次
    SpringMVC攔截器【監聽器、過濾器、攔截器的執行過程和對比】SpringMVC攔截器

2、攔截器的執行流程

單個攔截器

在運作程式時,攔截器的執行是有⼀定順序的,該順序與配置檔案中所定義的攔截器的順序相關。 單個 攔截器,在程式中的執行流程如下圖所示:

SpringMVC攔截器【監聽器、過濾器、攔截器的執行過程和對比】SpringMVC攔截器
  1. 程式先執行preHandle()方法,如果該⽅法的傳回值為true,則程式會繼續向下執行處理器中的方法,否則将不再向下執行。
  2. 在業務處理器(即控制器Controller類)處理完請求後,會執行postHandle()方法,然後會通過 DispatcherServlet向用戶端傳回響應。
  3. 在DispatcherServlet處理完請求後,才會執行afterCompletion()方法。

多個攔截器

多個攔截器(假設有兩個攔截器Interceptor1和Interceptor2,并且在配置檔案中, Interceptor1攔截 器配置在前),在程式中的執行流程如下圖所示:

SpringMVC攔截器【監聽器、過濾器、攔截器的執行過程和對比】SpringMVC攔截器

從圖可以看出,當有多個攔截器同時工作時,它們的preHandle()方法會按照配置方件中攔截器的配置 順序執行,而它們的postHandle()方法和afterCompletion()方法則會按照配置順序的反序執行。

3、自定義springmvc攔截器

自定義springmvc攔截器

package com.rick.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ⾃定義springmvc攔截器 */
public class MyIntercepter01 implements HandlerInterceptor {
/**
* 會在handler方法業務邏輯執⾏之前執行
* 往往在這裡完成權限校驗⼯作 * @param request
* @param response * @param handler
* @return  傳回值boolean代表是否放行,true代表放行,false代表中止 * @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, 
HttpServletResponse response, Object handler) throws Exception {
    System.out.println("MyIntercepter01 preHandle......");
    return true;
    }
/**
* 會在handler方法業務邏輯執⾏之後尚未跳轉頁面時執行 * @param request
* @param response * @param handler
* @param modelAndView  封裝了視圖和資料,此時尚未跳轉頁面呢,你可以在這裡針對傳回的 資料和視圖資訊進⾏修改
* @throws Exception */
@Override
public void postHandle(HttpServletRequest request, 
            HttpServletResponse response, Object handler, ModelAndView modelAndView) 
            throws Exception {
        System.out.println("MyIntercepter01 postHandle......");
    }
/**
* 頁面已經跳轉渲染完畢之後執行 * @param request
* @param response * @param handler
* @param ex  可以在這⾥捕獲異常 * @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception ex) 
                throws Exception {
    System.out.println("MyIntercepter01 afterCompletion......");
   }
}

           

注冊SpringMVC攔截器

<mvc:interceptors>
<!--攔截所有handler-->
<!--<bean class="com.rick.interceptor.MyIntercepter01"/>-->
<mvc:interceptor>
<!--配置目前攔截器的url攔截規則,**代表目前⽬錄下及其⼦⽬錄下的所有url--> <mvc:mapping path="/**"/>
<!--exclude-mapping可以在mapping的基礎上排除⼀些url攔截--> <!--<mvc:exclude-mapping path="/demo/**"/>-->
<bean class="com.rick.interceptor.MyIntercepter01"/> </mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.rick.interceptor.MyIntercepter02"/> 
</mvc:interceptor>
</mvc:interceptors>
           

繼續閱讀