天天看點

Spring Mvc那點事---(21)Spring Mvc攔截器

     Spring Mvc攔截器就是對web請求進行攔截處理。過濾非法和不和規則的請求,就像我們外地車如果進京,就需要辦進京證,但是對于一些違章行為的車,是沒辦法辦理進京證,是以這一部分車都被攔截,不能進京。 Spring MVC中的攔截器可以通過HandlerInterceptor接口和WebRequestInterceptor接口來實作。這一節我們來看看通過HandlerInterceptor的實作方法.

 1.建立攔截器

   我們建立一個攔截器類, 要繼承HandlerInterceptor接口,并實作HandlerInterceptor的三個方法。

  preHandle:表示預處理,最新執行,傳回值為true,會繼續向下執行,傳回值為false則終止執行,後續的controller将不在執行

 postHandle:就是對請求進行處理操作,會在調用controller方法之後執行,但是在傳回渲染視圖之前。

afterCompletion:該方法是在請求結束之後執行,也就是在渲染視圖之後執行,主要用于一些資源的清理工作。

public class firstInterpector implements HandlerInterceptor {

	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		//該方法是在請求結束之後執行,也就是在渲染視圖之後執行,主要用于一些資源的清理工作。
		
         System.out.println("afterCompletion");
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		// TODO Auto-generated method stub
		//就是對請求進行處理操作,會在調用controller方法之後執行,但是在傳回渲染視圖之前。
		  System.out.println("postHandle");
	}

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2) throws Exception {
		// TODO Auto-generated method stub
		//表示預處理,最新執行,傳回值為true,會繼續向下執行,傳回值為false則終止執行,後續的controller将不在執行
		  System.out.println("preHandle");
		return true;
	}

}
           

建立完攔截器類後,暫時還不能生效,需要進行配置。我們在dispatcher-servlet.xml添加攔截器配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"   
       xmlns:aop="http://www.springframework.org/schema/aop"   
       xmlns:context="http://www.springframework.org/schema/context"  
       xmlns:mvc="http://www.springframework.org/schema/mvc"   
       xmlns:tx="http://www.springframework.org/schema/tx"   
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.springframework.org/schema/aop   
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-3.0.xsd   
        http://www.springframework.org/schema/mvc   
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd   
        http://www.springframework.org/schema/tx   
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  
   <!--  <mvc:annotation-driven conversion-service="myConverter"/>   -->
    <context:component-scan base-package="com.testone.Controller" />  
  
  <mvc:interceptors>
    <bean class="com.interceptor.firstInterpector"></bean>
  </mvc:interceptors>
  
</beans>  
           

這樣我們啟動web網站,就可以看到輸出結果和執行順序了

preHandle
postHandle
afterCompletion
           

2.攔截器鍊

一個項目中可以有多個攔截器,如果有多個攔截器的話,執行順序會是神馬樣的,我們看看下面的例子。

public class firstInterpector implements HandlerInterceptor {

	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		//該方法是在請求結束之後執行,也就是在渲染視圖之後執行,主要用于一些資源的清理工作。
		
         System.out.println("firstInterpector--afterCompletion");
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		// TODO Auto-generated method stub
		//就是對請求進行處理操作,會在調用controller方法之後執行,但是在傳回渲染視圖之前。
		  System.out.println("firstInterpector--postHandle");
	}

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2) throws Exception {
		// TODO Auto-generated method stub
		//表示預處理,最新執行,傳回值為true,會繼續向下執行,傳回值為false則終止執行,後續的controller将不在執行
		  System.out.println("firstInterpector--preHandle");
		return true;
	}

}
           
public class secondInterpector implements HandlerInterceptor {

	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		 System.out.println("secondInterpector--afterCompletion");
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		// TODO Auto-generated method stub
		 System.out.println("secondInterpector--postHandle");
	}

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2) throws Exception {
		// TODO Auto-generated method stub
		 System.out.println("secondInterpector--preHandle");
		return true;
	}

}
           
<mvc:interceptors>
    <bean class="com.interceptor.firstInterpector"></bean>
    <bean class="com.interceptor.secondInterpector"></bean>
  </mvc:interceptors>
           

啟動網站,執行結果如下

firstInterpector--preHandle
           
secondInterpector--preHandle
secondInterpector--postHandle
firstInterpector--postHandle
secondInterpector--afterCompletion
firstInterpector--afterCompletion
           

可能有些同學對這樣的輸出結果感到困惑,我們看下面的一幅圖就能明白了。

Spring Mvc那點事---(21)Spring Mvc攔截器

如果我們想對某個頁面進行一個特定的攔截,可以如下設定

<mvc:interceptors>
  <!-- 在interceptors下面的是對所有的請求進行攔截 -->
    <bean class="com.interceptor.firstInterpector"></bean>
    <mvc:interceptor>
    <!-- 在interceptor下面的是對特定請求進行攔截 -->
    <mvc:mapping path="/Home/index"/>
    <bean class="com.interceptor.secondInterpector"></bean>
    </mvc:interceptor>
    
  </mvc:interceptors>
           

繼續閱讀