https://blog.csdn.net/zhibo_lv/article/details/81699360
https://www.cnblogs.com/jing99/p/11147152.html
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 {
}
}
preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView ;
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
HandlerInterceptorAdapter—>AsyncHandlerInterceptor—>HandlerInterceptor
可以自定义拦截器类,继承HandlerInterceptorAdapter抽象类进行拦截
适配器模式,不必全部实现HandlerInterceptor的三个方法,只需要根据业务需求,实现特定的方法
@Slf4j
@Component
public class RequestConextInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ip = request.getParameter("ip");
return true;
}
}
@Configuration
@Slf4j
public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer {
@Autowired
RequestConextInterceptor requestConextInterceptor ;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(requestConextInterceptor ).addPathPatterns("/**");
}
}
拦截器是一个列表,按顺序执行拦截器的preHandle()方法
如果preHandle()方法返回false,不再往下执行
执行主方法,即controller里的接口
逆序执行postHandle()方法
view页面渲染
逆序执行afterCompletion()方法