Spring MVC允许您通过处理程序拦截器拦截Web请求。 处理程序拦截器必须实现HandlerInterceptor接口,该接口包含三种方法:
- preHandle() –在处理程序执行之前调用,返回一个布尔值“ true”:继续处理程序执行链; “ false”,停止执行链并返回它。
- postHandle() –在处理程序执行之后调用,允许在渲染ModelAndView对象以查看页面之前对其进行操作。
- afterCompletion() –在完成请求之后调用。 很少使用,找不到任何用例。
在本教程中,您将创建两个处理程序拦截器以显示HandlerInterceptor的用法。
- ExecuteTimeInterceptor –拦截Web请求,并记录控制器执行时间。
- MaintenanceInterceptor –拦截Web请求,检查当前时间是否在维护时间之间,如果是,则将其重定向到维护页面。
注意
为了方便的默认实现,建议扩展HandlerInterceptorAdapter 。
1. ExecuteTimeInterceptor
截获控制器执行之前和之后,记录执行时间的开始和结束,并将其保存到现有截获的控制器的modelAndView中,以供以后显示。
文件:ExecuteTimeInterceptor.java
package com.mkyong.common.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter{
private static final Logger logger = Logger.getLogger(ExecuteTimeInterceptor.class);
//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
//after the handler is executed
public void postHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)
throws Exception {
long startTime = (Long)request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
//modified the exisitng modelAndView
modelAndView.addObject("executeTime",executeTime);
//log it
if(logger.isDebugEnabled()){
logger.debug("[" + handler + "] executeTime : " + executeTime + "ms");
}
}
}
2. MaintenanceInterceptor
在控制器执行之前进行拦截,检查当前时间是否在维护时间之间,如果是,则将其重定向到维护页面; 否则继续执行链。
文件:MaintenanceInterceptor.java
package com.mkyong.common.interceptor;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class MaintenanceInterceptor extends HandlerInterceptorAdapter{
private int maintenanceStartTime;
private int maintenanceEndTime;
private String maintenanceMapping;
public void setMaintenanceMapping(String maintenanceMapping) {
this.maintenanceMapping = maintenanceMapping;
}
public void setMaintenanceStartTime(int maintenanceStartTime) {
this.maintenanceStartTime = maintenanceStartTime;
}
public void setMaintenanceEndTime(int maintenanceEndTime) {
this.maintenanceEndTime = maintenanceEndTime;
}
//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
Calendar cal = Calendar.getInstance();
int hour = cal.get(cal.HOUR_OF_DAY);
if (hour >= maintenanceStartTime && hour <= maintenanceEndTime) {
//maintenance time, send to maintenance page
response.sendRedirect(maintenanceMapping);
return false;
} else {
return true;
}
}
}
3.启用处理程序拦截器
要启用它,请将您的处理程序拦截器类放在处理程序映射的“ interceptors ”属性中。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/welcome.htm">welcomeController</prop>
</props>
</property>
<property name="interceptors">
<list>
<ref bean="maintenanceInterceptor" />
<ref bean="executeTimeInterceptor" />
</list>
</property>
</bean>
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="interceptors">
<list>
<ref bean="executeTimeInterceptor" />
</list>
</property>
</bean>
<bean id="welcomeController"
class="com.mkyong.common.controller.WelcomeController" />
<bean class="com.mkyong.common.controller.MaintenanceController" />
<bean id="executeTimeInterceptor"
class="com.mkyong.common.interceptor.ExecuteTimeInterceptor" />
<bean id="maintenanceInterceptor"
class="com.mkyong.common.interceptor.MaintenanceInterceptor">
<property name="maintenanceStartTime" value="23" />
<property name="maintenanceEndTime" value="24" />
<property name="maintenanceMapping" value="/SpringMVC/maintenance.htm" />
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
下载源代码
下载它– SpringMVC-HandlerInterceptor-Example.zip (8 KB)
参考文献
- HandlerInterceptorAdapter文档
- HandlerInterceptor文档
- ControllerClassNameHandlerMapping示例
- SimpleUrlHandlerMapping示例
翻译自: https://mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/