Spring MVC 中 HandlerInterceptorAdapter的使用


概述

第1 部分 攔截器類

第2 部分 攔截器配置

第3 部分 實例

參考

第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 />的詳解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM