SpringMVC攔截器配置及使用方法


常見應用場景

1、日志記錄:記錄請求信息的日志,以便進行信息監控、信息統計、計算PV(Page View)等。
2、權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
3、性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完后記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
4、通用行為:讀取cookie得到用戶信息並將用戶對象放入請求,從而方便后續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現。
5、OpenSessionInView:如Hibernate,在進入處理器打開Session,在完成后關閉Session。本質也是AOP(面向切面編程),也就是說符合橫切關注點的所有功能都可以放入攔截器實現。

配置文件

定義兩個攔截器 HandleInterceptor1 , HandleInterceptor2

<!-- 攔截器 多個按順序攔截 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xwx.interceptor.HandleInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xwx.interceptor.HandleInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>

使用方法

preHandle 在Handle執行前 執行
return true 繼續執行 false不繼續執行

在modelAndView 執行前 執行
在 Handle 執行后 執行

HandleInterceptor1 .java

package com.xwx.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class HandleInterceptor1 implements HandlerInterceptor {

public static Logger log = Logger.getLogger(HandleInterceptor1.class.getName());

/**
* 在Handle執行前 執行
* return true 繼續執行 false不繼續執行
*/

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("HandleInterceptor1 ...... preHandle");
return true;
}

/**
* 在modelAndView 執行前 執行
*/

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("HandleInterceptor1 ...... postHandle");

}

/**
* 在 Handle 執行后 執行
*/

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.info("HandleInterceptor1 ...... afterCompletion");
}

}

HandleInterceptor2 .java

package com.xwx.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class HandleInterceptor2 implements HandlerInterceptor {

public static Logger log = Logger.getLogger(HandleInterceptor2.class.getName());

/**
* 在Handle執行前 執行
* return true 繼續執行 false不繼續執行
*/

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("HandleInterceptor2 ...... preHandle");
return false;
}

/**
* 在modelAndView 執行前 執行
*/

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("HandleInterceptor2 ...... postHandle");

}

/**
* 在 Handle 執行后 執行
*/

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.info("HandleInterceptor2 ...... afterCompletion");
}

}

攔截器執行順序

preHandle 按順序執行, postHandle afterCompletion 則是逆向執行

16:08:29,187 INFO HandleInterceptor1:20 - HandleInterceptor1 ...... preHandle
16:08:29,187 INFO HandleInterceptor2:20 - HandleInterceptor2 ...... preHandle

16:08:29,640 INFO HandleInterceptor2:29 - HandleInterceptor2 ...... postHandle
16:08:29,640 INFO HandleInterceptor1:29 - HandleInterceptor1 ...... postHandle

16:08:29,706 INFO HandleInterceptor2:38 - HandleInterceptor2 ...... afterCompletion
16:08:29,706 INFO HandleInterceptor1:38 - HandleInterceptor1 ...... afterCompletion

第一個攔截器沒通過,不會繼續執行。
第二個攔截器沒通過,會直接跳出當前攔截器,繼續執行上個攔截器的 afterCompletion

16:14:23,981  INFO HandleInterceptor1:20 - HandleInterceptor1 ...... preHandle
16:14:23,981 INFO HandleInterceptor2:20 - HandleInterceptor2 ...... preHandle
16:14:23,982 INFO HandleInterceptor1:38 - HandleInterceptor1 ...... afterCompletion

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com