Spring MVC 自定義攔截器

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

HandlerInterceptor接口的代碼如下:

[java] view plain copy
  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,   
  7. HttpServletResponse response,    
  8.      Object handler)   
  9.          throws Exception;    
  10.      // postHandle()方法在業務處理器處理請求之後被調用   
  11.      void postHandle(    
  12.              HttpServletRequest request, HttpServletResponse   
  13. response, Object    
  14.              handler, ModelAndView modelAndView)   
  15.              throws Exception;    
  16.      // afterCompletion()方法在DispatcherServlet完全處理完請求後被調用   
  17.      void afterCompletion(    
  18.              HttpServletRequest request, HttpServletResponse  
  19. response, Object    
  20.              handler, Exception ex)   
  21.              throws Exception;    
  22.    
  23.  }  

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

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

afterCompletion():這個方法在DispatcherServlet完全處理完請求後被調用,可以在該方法中進行一些資源清理的操作。


例子: 通過用戶session是否爲空進行攔截處理

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

[sql] view plain copy
  1. package com.yjde.web.interceptor;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import org.springframework.web.servlet.ModelAndView;  
  9. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  10.   
  11. public class TimeInterceptor extends HandlerInterceptorAdapter {  
  12.     // 繼承HandlerInterceptorAdapter類  
  13.   
  14.     private String outsideOfficeHoursPage;// outsideOfficeHoursPage屬性指定錯誤提示頁面的URL  
  15.   
  16.     // 重寫 preHandle()方法,在業務處理器處理請求之前對該請求進行攔截處理  
  17.     public boolean preHandle(HttpServletRequest request,  
  18.             HttpServletResponse response, Object handler) throws Exception {  
  19.         User user = (User)requset.getSession("key");
  20. if(user == null){
  21.             response.sendRedirect(outsideOfficeHoursPage); // 返回提示頁面
  22.      return false;
  23. }
  24. return true; 
  25.     }  
  26.   
  27.     public void postHandle(HttpServletRequest request,  
  28.             HttpServletResponse response, Object o, ModelAndView mav)  
  29.             throws Exception {  
  30.         System.out.println("postHandle");  
  31.     }  
  32.   
  33.     public void afterCompletion(HttpServletRequest request,  
  34.             HttpServletResponse response, Object o, Exception excptn)  
  35.             throws Exception {  
  36.         System.out.println("afterCompletion");  
  37.     }  
  38.   
  39.     public String getOutsideOfficeHoursPage() {  
  40.         return outsideOfficeHoursPage;  
  41.     }  
  42.   
  43.     public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {  
  44.         this.outsideOfficeHoursPage = outsideOfficeHoursPage;  
  45.     }  
  46.   
  47. }  
  48. 可以看出,上面的代碼重寫了preHandle()方法,該方法在業務處理器處理請求之前被調用。在該方法中,首先獲得 user對象,判斷其是否在  
  49. 如果在,返回true,這樣纔會調用業務控制器去處理該請求;否則直接轉向一個頁面,返回false,這樣該請求就不會被處理。

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

    [java] view plain copy
    1.   
    [html] view plain copy
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"  
    4.     xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    7.             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    8.             http://www.springframework.org/schema/context   
    9.             http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    10.             http://www.springframework.org/schema/aop   
    11.             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    12.             http://www.springframework.org/schema/tx   
    13.             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    14.             http://www.springframework.org/schema/mvc   
    15.             http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
    16.             http://www.springframework.org/schema/context   
    17.             http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
    18.     <!-- 
    19.         使Spring支持自動檢測組件,如註解的Controller 
    20.     -->  
    21.     <context:component-scan base-package="com.yjde.web.controller" />  
    22.   
    23.     <bean id="viewResolver"  
    24.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
    25.         p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />  
    26.     <mvc:interceptors>  
    27.         <mvc:interceptor>  
    28.             <!--設置攔截的路徑-->  
    29.             <mvc:mapping path="/main.htm" />  
    30.             <bean class="com.yjde.web.interceptor.TimeInterceptor">  
    31.                 <!--outsideOfficeHoursPage屬性指定提示頁面的URL-->  
    32.                 <property name="outsideOfficeHoursPage">  
    33.                     <value>/login.html
    34.                     </value>  
    35.                 </property>  
    36.             </bean>  
    37.         </mvc:interceptor>  
    38.     </mvc:interceptors>  
    39.     <bean id="messageSource"  
    40.         class="org.springframework.context.support.ResourceBundleMessageSource"  
    41.         p:basename="message">  
    42.     </bean>  
    43. </beans>  

    控制反轉是Spring框架的核心思想,即用一個接口去定義一些操作,在接口的實現類中去重寫這些操作,然後在Spring的配置 文件中去把該接口的實現類注入到應有框架中,這樣就可以通過調用接口去調用接口的實現類。此次講的攔截器就體現了這種思想,即實現 HandlerInterceptorAdapter接口,重寫preHandle()方法並在配置文件中實現TimeInterceptor的注入。這 樣當框架調用HandlerInterceptorAdapter時,就可以調用到TimeInterceptor類的preHandle()方法。
  51.   




發佈了25 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章