1. 程式人生 > >spring mvc 攔截器 配置

spring mvc 攔截器 配置

第一步:新建攔截器類,可以建多個,繼承HandlerInterceptor介面,實現preHandle();postHandle();afterCompletion()三個方法.

preHandle() 方法:該方法會在控制器方法前執行,其返回值表示是否中斷後續操作。當其返回值為true時,表示 繼續向下執行;當其返回值為false時,會中斷後續的所有操作(包括呼叫下一個攔截器和控制器類中的方法執行等)。

postHandle()方法:該方法會在控制器方法呼叫之後,且解析檢視之前執行。可以通過此方法對請求域中的模型和檢視做出進一步的修改。

afterCompletion()方法:該方法會在整個請求完成,即檢視渲染結束之後執行。可以通過此方法實現一些資源釋放、記錄日誌資訊等工作。

public class Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("Interceptor-preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor-postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("Interceptor-afterCompletion");
    }
}

public class DetailInterceptor implements HandlerInterceptor {
    //請求之前執行的方法,也就是controller之前執行,多用於編碼,安全處理,邏輯控制
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("DetailInterceptor-preHandle");
        return true;
    }
    //在controller生成檢視之前執行,可以修該ModelAndView物件
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("DetailInterceptor-postHandle");
    }
    //在響應已經渲染之後執行,用於釋放資源
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("DetailInterceptor-afterCompletion");
    }
}

第二步:配置檔案配置

<!--攔截器,新建攔截器類,繼承HandlerInterceptor介面,實現方法-->
    <!--可以配置多個-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--表示匹配指定路徑的請求才進行攔截,攔截detail開頭的所有路徑-->
            <mvc:mapping path="/detail/*"/>
            <bean class="cn.kgc.myinterceptor.DetailInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <!--表示匹配指定路徑的請求才進行攔截,攔截所有路徑-->
            <mvc:mapping path="/**"/>
            <bean class="cn.kgc.myinterceptor.Interceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

多個攔截器的執行流程:

在這裡插入圖片描述 從圖可以看出,當有多個攔截器同時工作時,它們的preHandle()方法會按照配置檔案中攔截器的配置順序執行,而它們的postHandle()方法和afterCompletion()方法則會按照配置順序的反序執行。