spring-mvc 的 攔截器應用例子

23.4 使用攔截器

2009-09-27 15:20 徐林林 清華大學出版社 我要評論(0) 字號: T | T
一鍵收藏,隨時查看,分享好友!

《Java Web編程從入門到實踐(15小時高清晰、交互式視頻教學)》第23章SSpring的Web架構,本章結合實例講解了Spring MVC框架的各個組件的使用方法、Spring攔截器和數據驗證的使用方法,以及Spring和Struts 2集成的實現方法。本節爲你們介紹使用攔截器。html

AD:程序員

23.4  使用攔截器web

和Struts2同樣,Spring MVC也可使用攔截器對請求進行攔截處理,用戶能夠自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor接口。spring

【示例23-9】HandlerInterceptor接口的代碼以下:編程

  
  
           
  
  
  1. package org.springframework.web.servlet;  
  2. import Javax.servlet.http.HttpServletRequest;  
  3. import Javax.servlet.http.HttpServletResponse;  
  4. public interface HandlerInterceptor {  
  5.     // preHandle()方法在業務處理器處理請求以前被調用  
  6.     boolean preHandle(HttpServletRequest request, 
    HttpServletResponse response,  
  7.     Object handler)  
  8.         throws Exception;  
  9.     // postHandle()方法在業務處理器處理請求以後被調用  
  10.     void postHandle(  
  11.             HttpServletRequest request, HttpServletResponse 
    response, Object  
  12.             handler, ModelAndView modelAndView)  
  13.             throws Exception;  
  14.     // afterCompletion()方法在DispatcherServlet徹底處理完請求後被調用  
  15.     void afterCompletion(  
  16.             HttpServletRequest request, HttpServletResponse
    response, Object  
  17.             handler, Exception ex)  
  18.             throws Exception;  
  19.  

下面對代碼中的三個方法進行解釋。瀏覽器

preHandle():這個方法在業務處理器處理請求以前被調用,在該方法中對用戶請求request進行處理。若是程序員決定該攔截器對請求進 行攔截處理後還要調用其餘的攔截器,或者是業務處理器去進行處理,則返回true;若是程序員決定不須要再調用其餘的組件去處理請求,則返回false。架構

postHandle():這個方法在業務處理器處理完請求後,可是DispatcherServlet向客戶端返回請求前被調用,在該方法中對用戶請求request進行處理。app

afterCompletion():這個方法在DispatcherServlet徹底處理完請求後被調用,能夠在該方法中進行一些資源清理的操做。框架

下面經過一個例子來講明如何使用Spring MVC框架的攔截器。ide

【示例23-10】要求編寫一個攔截器,攔截全部不在工做時間的請求,把這些請求轉發到一個特定的靜態頁面,而不對它們的請求進行處理。

首先編寫TimeInterceptor.Java,代碼以下:

  
  
           
  
  
  1. package com.examp.ch23;  
  2. import Java.util.Calendar;  
  3. import Javax.servlet.http.HttpServletRequest;  
  4. import Javax.servlet.http.HttpServletResponse;  
  5. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  6.  
  7. public class TimeInterceptor extends HandlerInterceptorAdapter {  
  8.                                         //繼承HandlerInterceptorAdapter類  
  9.  
  10.     private int openingTime;            //openingTime 屬性指定上班時間  
  11.     private int closingTime;            //closingTime屬性指定下班時間  
  12.     private String outsideOfficeHoursPage;  
  13.                                         //outsideOfficeHoursPage屬性指定錯誤  
  14.                                           提示頁面的URL  
  15.     public void setOpeningTime(int openingTime) {  
  16.         this.openingTime = openingTime;  
  17.     }  
  18.     public void setClosingTime(int closingTime) {  
  19.         this.closingTime = closingTime;  
  20.     }  
  21.     public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {  
  22.         this.outsideOfficeHoursPage = outsideOfficeHoursPage;  
  23.     }  
  24.     //重寫 preHandle()方法,在業務處理器處理請求以前對該請求進行攔截處理  
  25.     public boolean preHandle(  
  26.             HttpServletRequest request,  
  27.             HttpServletResponse response,  
  28.             Object handler)  
  29.     throws Exception {  
  30.         Calendar cal = Calendar.getInstance();  
  31.         int hour = cal.get(Calendar.HOUR_OF_DAY);       //獲取當前時間  
  32.         if (openingTime<=hour && hour<closingTime) {    //判斷當前是否處於工做  
  33.                                                           時間段內  
  34.             return true;  
  35.         } else {  
  36.             response.sendRedirect(outsideOfficeHoursPage);  //返回提示頁面  
  37.             return false;  
  38.         }  
  39.     }  

能夠看出,上面的代碼重載了preHandle()方法,該方法在業務處理器處理請求以前被調用。在該方法中,首先得到當前的時間,判斷其是否在 openingTime和closingTime之間,若是在,返回true,這樣纔會調用業務控制器去處理該請求;不然直接轉向一個靜態頁面,返回 false,這樣該請求就不會被處理。

下面是在dispatcherServlet-servlet.xml中對攔截器進行的配置,代碼以下:

  
  
           
  
  
  1. <bean id="urlMapping" class="org.springframework.web.servlet.handler.Simple-  
  2. UrlHandlerMapping">  
  3.         <property name="mappings">  
  4.             <props>  
  5.                 <prop key="helloWorld.do">helloWorldAction</prop>  
  6.                 <prop key="login.do">loginController</prop>  
  7.             </props>  
  8.         </property>  
  9.         <property name="interceptors">  
  10.                                 <!--在interceptors 屬性中定義全部的攔截器-->  
  11.             <list>  
  12.                 <ref bean="officeHoursInterceptor"/>  
  13.                                 <!--引用officeHoursInterceptor 攔截器-->  
  14.             </list>  
  15.         </property>  
  16.           
  17. </bean>  
  18. <!--定義TimeInterceptor攔截器,id爲officeHoursInterceptor -->  
  19. <bean id="officeHoursInterceptor" 
  20.       class="com.examp.ch23.TimeInterceptor">  
  21.     <!--openingTime 屬性指定上班時間-->  
  22.     <property name="openingTime"><value>9</value></property>  
  23.     <!--closingTime屬性指定下班時間-->  
  24.     <property name="closingTime"><value>18</value></property>  
  25.      <!--outsideOfficeHoursPage屬性指定提示頁面的URL-->  
  26.     <property name="outsideOfficeHoursPage"><value>http://localhost:8080/  
  27.     ch23/outsideOfficeHours.html</value></property>  
  28. </bean> 

能夠看出,上面代碼用bean標籤去定義TimeInterceptor,令其id爲officeHoursInterceptor,並給它的3個 屬性賦值。在urlMapping中經過<property name="interceptors">去指定officeHoursInterceptor爲一個攔截器,讀者能夠在<list> 和</list>之間定義多個攔截器。

outsideOfficeHours.html的代碼很簡單,只是輸出一句提示語。

運行程序,在瀏覽器中隨便訪問一個頁面,若是請求的時間在9點~18點之間,則該請求能夠被處理;不然,返回一句提示語,如圖23-5所示。

 
(點擊查看大圖)圖23-5  請求被攔截效果圖

說 明:在第22章中介紹過控制反轉是Spring框架的核心思想,即用一個接口去定義一些操做,在接口的實現類中去重寫這些操做,而後在Spring的配置 文件中去把該接口的實現類注入到應有框架中,這樣就能夠經過調用接口去調用接口的實現類。本節講的攔截器就體現了這種思想,即實現 HandlerInterceptorAdapter接口,重寫preHandle()方法並在配置文件中實現TimeInterceptor的注入。這 樣當框架調用HandlerInterceptorAdapter時,就能夠調用到TimeInterceptor類的preHandle()方法。

相關文章
相關標籤/搜索