用HandlerInterceptor截断请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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截断。如果当前的时间在办公时间之外,则用户被重定向到一个静态页面,静态页面会提醒在办公时间访问该网站。
(完)
以上是关于用HandlerInterceptor截断请求的主要内容,如果未能解决你的问题,请参考以下文章
HandlerInterceptorAdapter或HandlerInterceptor的使用
Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题
Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题
HandlerInterceptor拦截实现对PathVariable变量的读取