spring mvc 攔截器 配置
阿新 • • 發佈:2018-12-19
第一步:新建攔截器類,可以建多個,繼承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()方法則會按照配置順序的反序執行。