标签:
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://www.cnblogs.com/lin-xuan/p/5187030.html