Spring MVC实现拦截器的方法有两种:即实现HandlerInterceptor接口和继承此接口的实现类HandlerInterceptorAdapter
一、通过实现HandlerInterceptor接口的方式设置拦截器
1.1 定义拦截器TimeInterceptor 并继承HandlerInterceptor接口
package com.jt.common.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class TimeInterceptor implements HandlerInterceptor {
/**
* 该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
* 当其返回值为false时,会中断后续的所有操作 (包括调用下一个拦截器和控制器类中的方法执行等)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return false;
}
/** 该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/** 该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。 */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
1.2 为拦截器添加功能代码
package com.jt.common.interceptor;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.jt.common.annotation.HandlerMonitor;
@Component
public class TimeInterceptor implements HandlerInterceptor {
public TimeInterceptor() {
System.out.println("TimeInterceptor.TimeInterceptor()");
}
/**
* 该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
* 当其返回值为false时,会中断后续的所有操作 (包括调用下一个拦截器和控制器类中的方法执行等)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HandlerMethod hMethod = (HandlerMethod) handler;
Method method = hMethod.getMethod();
if (method.isAnnotationPresent(HandlerMonitor.class)) {
String methodName = method.getName();
/* 不要讲此变量以属性的方式写到外面,线程不安全 */
long startTime = System.nanoTime();
System.out.println(methodName + " start time is " + startTime);
request.setAttribute("startTime", startTime);
}
System.out.println("preHandle");
return true;// true 放行
}
/** 该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle()");
}
/** 该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。 */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion");
Method method = ((HandlerMethod) handler).getMethod();
String methodName = method.getName();
if (method.isAnnotationPresent(HandlerMonitor.class)) {
long endTime = System.nanoTime();
System.out.println(methodName + " end time is " + endTime);
long startTime = (Long) request.getAttribute("startTime");
System.out.println("totalTime=" + (endTime - startTime));
}
}
}
1.3 在Spring配置文件中进行拦截目标配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 系统运维监控(只能在某个限定时间之内限定) -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="systemIntercoptor"/>
</mvc:interceptor>
<!-- 控制层方法执行时长监控 -->
<mvc:interceptor> <!-- 配置如下元素时要注意顺序 -->
<!-- 配置拦截那些路径 -->
<mvc:mapping path="/**"/>
<!-- 配置那些路径不进行拦截 -->
<mvc:exclude-mapping path="/doLogin.do"/>
<!-- 拦截到请求以后由哪个拦截器进行处理 -->
<ref bean="timeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
二、通过继承实现类HandlerInterceptorAdapter设置拦截器
2.1 定义拦截器SystemIntercoptor并继承实现类HandlerInterceptorAdapter
package com.jt.common.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class SystemIntercoptor extends HandlerInterceptorAdapter {
/** 在业务处理器处理请求之前被调用,预处理,可以进行编码、安全控制等处理 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return super.preHandle(request, response, handler);
}
/** 在业务处理器处理请求执行完成后,生成视图之前执行 */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
/** 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面),可以根据ex是否为null判断是否发生了异常,进行日志记录 */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
2.2 继承父类相应的方法,进行功能实现
package com.jt.common.interceptor;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@Component
public class SystemIntercoptor extends HandlerInterceptorAdapter {
/**
* 此方法中基于请求时间,决定请求是被拦截还是放行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取当前时间以后和9点和17点进行比较
/*获取日历对象*/
Calendar c = Calendar.getInstance();
long t = c.getTimeInMillis();
c.set(Calendar.HOUR_OF_DAY, 6);
c.set(Calendar.HOUR, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
long time9 = c.getTimeInMillis();
c.set(Calendar.HOUR_OF_DAY, 22);
long time17 = c.getTimeInMillis();
if(t<time9||t>time17){
System.out.println("系统维护时间...");
return false;
}
return true;//放行
}
}
2.3 在Spring配置文件中进行拦截目标配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 系统运维监控(只能在某个限定时间之内限定) -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="systemIntercoptor"/>
</mvc:interceptor>
<!-- 控制层方法执行时长监控 -->
<mvc:interceptor> <!-- 配置如下元素时要注意顺序 -->
<!-- 配置拦截那些路径 -->
<mvc:mapping path="/**"/>
<!-- 配置那些路径不进行拦截 -->
<mvc:exclude-mapping path="/doLogin.do"/>
<!-- 拦截到请求以后由哪个拦截器进行处理 -->
<ref bean="timeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>