Spring的處理器映射 (handler mapping) 機制包括截斷器 (handler interceptors), 截斷器用於對request增加特定的處理。
截斷器必須實現org.springframework.web.servlet包中的HandlerInterceptor接口。HandlerInterceptor接口定義了三個方法:preHandle(..)方法在處理器之前運行;postHandle(..)方法在處理器之后運行;afterCompletion(..)方法在整個請求被處理完之后運行。
這三個方法大提高了處理request的靈活性。
preHandle(..)方法返回boolean值,可用此方法停止或繼續處理過程。如果此方法返回true,則處理過程繼續,如果此方法返回false,DispatcherServlet認為該截斷器接手處理請求 (比如,渲染一個視圖),所以就不再執行別的截斷器和處理器。
一個截斷器的例子:
在applicationContext-mvc.xml (命名可能不一樣,但功能一樣) 中配置<mvc:interceptors>:
1 <mvc:interceptors> 2 <mvc:interceptor> 3 <mvc:mapping path="/**" /> 4 <mvc:exclude-mapping path="/test_receive_deal_audit_result" /> 5 <bean class="samples.TimeBasedAccessInterceptor"> 6 <property name="openingTime" value="9"/> 7 <property name="closingTime" value="18"/> 8 </bean> 9 10 </mvc:interceptor> 11 </mvc:interceptors>
1 package samples; 2 3 public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter { 4 5 private int openingTime; 6 private int closingTime; 7 8 public void setOpeningTime(int openingTime) { 9 this.openingTime = openingTime; 10 } 11 12 public void setClosingTime(int closingTime) { 13 this.closingTime = closingTime; 14 } 15 16 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 17 Object handler) throws Exception { 18 Calendar cal = Calendar.getInstance(); 19 int hour = cal.get(HOUR_OF_DAY); 20 if (openingTime <= hour && hour < closingTime) { 21 return true; 22 } 23 response.sendRedirect("http://host.com/outsideOfficeHours.html"); 24 return false; 25 } 26 }
如果工程中定義的是注解驅動,則所有request都會被TimeBasedAccessInterceptor截斷。如果當前的時間在辦公時間之外,則用戶被重定向到一個靜態頁面,靜態頁面會提醒在辦公時間訪問該網站。
(完)