用HandlerInterceptor截斷請求


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截斷。如果當前的時間在辦公時間之外,則用戶被重定向到一個靜態頁面,靜態頁面會提醒在辦公時間訪問該網站。

 

參考資料: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM