参考
https://blog.csdn.net/zhibo_lv/article/details/81699360
https://www.cnblogs.com/jing99/p/11147152.html
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 {
}
}
preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView ;
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
HandlerInterceptorAdapter是抽象类,间接实现了HandlerInterceptor接口
-
HandlerInterceptorAdapter—>AsyncHandlerInterceptor—>HandlerInterceptor
-
可以自定义拦截器类,继承HandlerInterceptorAdapter抽象类进行拦截
-
适配器模式,不必全部实现HandlerInterceptor的三个方法,只需要根据业务需求,实现特定的方法
如何使用
- 创建一个拦截器类,继承HandlerInterceptorAdapter抽象类
@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;
}
}
- 重写preHandle()方法,通过HttpServletRequest获取参数、URI、Cookie、Session等进行业务处理
- 配置拦截器
新建一个类,实现WebMvcConfigurer接口,重写addInterceptors()方法
把刚才新建的拦截器实例,添加进拦截器列表里
@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()方法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)