用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截断。如果当前的时间在办公时间之外,则用户被重定向到一个静态页面,静态页面会提醒在办公时间访问该网站。

 

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

(完)

以上是关于用HandlerInterceptor截断请求的主要内容,如果未能解决你的问题,请参考以下文章

HandlerInterceptorAdapter或HandlerInterceptor的使用

Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题

Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题

HandlerInterceptor拦截实现对PathVariable变量的读取

HandlerInterceptor与MethodInterceptor

springboot post请求参数中有&还是被截断