概述
第1 部分 攔截器類
一般情況下,對來自瀏覽器的請求的攔截,是利用Filter實現的,這種方式可以實現Bean預處理、后處理。
Spring MVC的攔截器不僅可實現Filter的所有功能,還可以更精確的控制攔截精度。
Spring為我們提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter這個適配器,繼承此類,可以非常方便的實現自己的攔截器。他有三個方法:
1 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 2 throws Exception { 3 return true; 4 } 5 public void postHandle( 6 HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 7 throws Exception { 8 } 9 public void afterCompletion( 10 HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 11 throws Exception { 12 }
分別實現預處理、后處理(調用了Service並返回ModelAndView,但未進行頁面渲染)、返回處理(已經渲染了頁面)
在preHandle中,可以進行編碼、安全控制等處理;
在postHandle中,有機會修改ModelAndView;
在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日志記錄。
第2 部分 攔截器配置
如果基於xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping進行Url映射(相當於struts的path映射)和攔截請求(注入interceptors),
如果基於注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意無論基於xml還是基於注解,HandlerMapping bean都是需要在xml中配置的。
基於注解的配置如下:
<mvc:interceptors> <bean class="com.Common.action.PurviewInterceptTest" /> </mvc:interceptors>
第3 部分 實例
/** * 攔截器測試 * * @ClassName: PurviewInterceptTest * @author xingle * @date 2015-3-6 下午12:02:08 */ public class PurviewInterceptTest extends HandlerInterceptorAdapter { private UrlPathHelper urlPathHelper = new UrlPathHelper(); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 獲取訪問url String url = urlPathHelper.getLookupPathForRequest(request); String queryString = urlPathHelper.getOriginatingQueryString(request); String redirectURL = url; if (!StringHelperTools.isEmpty(queryString)) { redirectURL = redirectURL + "?" + queryString; } if (true) {// 測試跳轉到其他頁面 response.sendRedirect(request.getContextPath() + "/Login1.html"); return true; } return super.preHandle(request, response, handler); } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception { // 你自己的業務邏輯 //下面這句話不要動,就這樣放着。你在處理你的業務邏輯之后,spring會將你的請求和響應繼續往容器傳或者往客戶端進行傳遞 super.postHandle(request, response, handler, modelAndView); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 你自己的業務邏輯 //下面這句話不要動,就這樣放着。你在處理你的業務邏輯之后,spring會將你的請求和響應繼續往容器傳或者往客戶端進行傳遞 super.afterCompletion(request, response, handler, ex); } }
1.spring mvc攔截器和<mvc:annotation-driven />的詳解