Spring MVC 4之Interceptors攔截器

Spring MVC 4的Interceptor攔截器與Struts2的攔截器相似,其主要目的是對全部的URL請求進行攔截處理,處理某些規則的請求,如權限驗證,判斷用戶是否登錄等。


    在Spring MVC 4中使用攔截器,必須先在Spring.xml中配置使用攔截器,配置的方法有兩種:一種是傳統的bean方式配置,另一種是使用 http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 定義的<mvc:interceptors>。具體實現代碼以下:


    方案一:使用bean配置interceptors攔截器
web

<beans>
    <bean id="handlerMapping"
            class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="loginInterceptor"/>
            </list>
        </property>
    </bean>

    <bean id="loginInterceptor" class="com.favccxx.favblog.interceptor.LoginInterceptor">
    </bean>
<beans>

   方法二: 使用<mvc:interceptors>配置攔截器,
<mvc:interceptors>
  <mvc:interceptor>
   <!-- 默認全部的請求都進行攔截 -->
   <mvc:mapping path="/*"/>
   <bean class="com.favccxx.favblog.interceptor.LoginInterceptor"></bean>
  </mvc:interceptor>
</mvc:interceptors>




不管採用哪一種方式,實際上都採用了註解的方法,並繼承了 AbstractHandlerMapping類將 interceptors 攔截器注入進去。AbstractHandlerMapping類的屬性以下圖所示:


spacer.gif


    在Spring MVC 4 中的類要實現攔截器處理映射必需要實現 org.springframework.web.servlet 包下的HandlerInterceptor接口,該接口定義了三個方法: preHandle(...)在處理器調用以前被調用; postHandle(...)在處理器調用以後執行;而afterCompletion(...)在請求結束以後調用。這三種方法提供了足夠的靈活性來作各類各樣的預處理和後處理。

    preHandle(...)方法會返回布爾值,可使用該方法終止或繼續執行的處理鏈。當返回true時,處理鏈繼續執行。不然的話,DispatcherServlet會假設攔截器已經處理了請求(如渲染適當的視圖),再也不執行其它攔截器和當前的處理器。

    Spring MVC 4一樣提供了兩種方式實現攔截器,一種是實現HandlerInterceptor接口;另一種是繼承HandlerInterceptorAdapter類,不過HandlerInterceptorAdapter類也實現了HandlerInterceptor接口,因此歸根結底仍是如上文所述,攔截器必須實現HandlerInterceptor接口。


    實現攔截器
public class LoginInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request,   HttpServletResponse response, Object handler) throws Exception {  // TODO Auto-generated method stub  System.out.println("------" + System.nanoTime());  return true; } public void afterCompletion(HttpServletRequest request,   HttpServletResponse response, Object handler, Exception ex)   throws Exception {  // TODO Auto-generated method stub } public void postHandle(HttpServletRequest request,   HttpServletResponse response, Object handler,   ModelAndView modelAndView) throws Exception {  FavUser favUser = (FavUser) (request.getSession()).getAttribute(SysConstants.USER_SESSION_KEY);  if (favUser == null) {   modelAndView.setViewName("redirect:/login");  } }}
相關文章
相關標籤/搜索