1、用途
我们在使用springMVC的使用HandlerInterceptor对请求进行拦截处理,比如
- 记录日志
- 权限验证
- 限流处理
- …
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
HandlerInterceptor接口定义了三个拦截点
- preHandle(…)前置拦截
在执行请求之前处理,当返回 true
时,继续后续 handler
的执行;当返回 false
时,不进行后续 handler
的执行。
-
postHandle(…)后置处理逻辑
在视图 View 在渲染之前,做一些处理,目前都是前后端分离,所以这个后置拦截点,使用的就已经比较少了
-
afterCompletion(…)在执行完前置和后置拦截后,实现请求完成后的处理逻辑。
2、自定义 HandlerInterceptor
@Slf4j
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle [handler({})]", handler);
//返回true, 继续执行handler, fasle,不再执行handler
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle [handler({})]", handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("[afterCompletion][handler({})]", handler, ex);
}
}
3、注册拦截器
@Configuration
public class SpringMVCConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器 拦截器一
registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**"); //拦截的url
}
}