创建拦截器
1 实现 HandlerInterceptor 创建拦截器
@Component
public class TimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("startTime", new Date().getTime()); // preHandle中参数传到 postHandle
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
Long start = (Long) request.getAttribute("startTime"); // 从preHandle 获取数据 | handler 可以获取 当前拦截的 控制器方法
System.out.println("time interceptor 耗时:"+ (new Date().getTime() - start));
}
// 不管控制器方法 成功还是失败 都会进入此方法
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
Long start = (Long) request.getAttribute("startTime");
System.out.println("time interceptor 耗时:"+ (new Date().getTime() - start));
System.out.println("ex is "+ex);
}
}
2 配置类中 继承 WebMvcConfigurerAdapter 注册拦截器
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@SuppressWarnings("unused")
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}
}
preHandle、postHandle与afterCompletion
preHandle
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则中断执行,注意:不会进入afterCompletion
postHandle
调用前提:preHandle返回true
调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
备注:postHandle虽然post打头,但post、get方法都能处理
afterCompletion
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
多用于清理资源
- 切片 拿不到原始的 HTTP请求参数,可以拿到被切片控制器的 方法 参数 ,可以拿到参数值
- 过滤器 可以拿到原始的 http请求,拿不到 被过滤的 控制器 方法 参数
- 拦截器 拿不到原始的 HTTP请求参数,可以拿到被拦截的控制器的 方法 参数,但是拿不到 参数值
浙公网安备 33010602011771号