1.定义拦截器类实现HandlerInterceptor接口,并实现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进行视图的渲染之后
执行顺序:链式Intercepter情况下,Intercepter按照注册声明的顺序倒着执行。
备注:多用于清理资源
@Slf4j
public class SystemInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("preHandle执行了");
return true;
}
@Override
public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
log.info("postHandle执行了");
}
@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
log.info("afterCompletion执行了");
}
}
2.配置InterceptorConfig实现WebMvcConfigurer接口创建Bean实例并注册声明,注册顺序即执行顺序。
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(systemInterceptor()).addPathPatterns("/**");
}
@Bean
public SystemInterceptor systemInterceptor() {
return new SystemInterceptor();
}
}