参考

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的三个方法,只需要根据业务需求,实现特定的方法

如何使用

  1. 创建一个拦截器类,继承HandlerInterceptorAdapter抽象类
@Slf4j
@Component
public class RequestConextInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String ip = request.getParameter("ip");return true;}
}
  1. 重写preHandle()方法,通过HttpServletRequest获取参数、URI、Cookie、Session等进行业务处理
  2. 配置拦截器
    新建一个类,实现WebMvcConfigurer接口,重写addInterceptors()方法
    把刚才新建的拦截器实例,添加进拦截器列表里
@Configuration
@Slf4j
public class SpringBootPlusWebMvcConfig implements WebMvcConfigurer {@AutowiredRequestConextInterceptor requestConextInterceptor ;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(requestConextInterceptor ).addPathPatterns("/**");}
}

运行流程

  1. 拦截器是一个列表,按顺序执行拦截器的preHandle()方法

  2. 如果preHandle()方法返回false,不再往下执行

  3. 执行主方法,即controller里的接口

  4. 逆序执行postHandle()方法

  5. view页面渲染

  6. 逆序执行afterCompletion()方法

Spring拦截器HandlerInterceptor和HandlerInterceptorAdapter相关推荐

  1. SpringMVC拦截器HandlerInterceptor使用

    Spring MVC 拦截器(HandlerInterceptor)使用 Spring 拦截器--HandlerInterceptor 转载于:https://www.cnblogs.com/goto ...

  2. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  3. 拦截器HandlerInterceptor+方法参数解析器HandlerMethodArgumentResolver用于统一获取当前登录用户信息

    文章目录 前言 一.拦截器+方法参数解析器 是什么? 二.具体实现步骤 1.自定义权限拦截器LoginInterceptor拦截所有request请求,并将token解析为currentUser,最终 ...

  4. Spring拦截器实现登录拦截

    hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容.昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题.    说起拦截器 ...

  5. Java(Spring拦截器、过滤器、AOP)

    过滤器: 过滤器是servlet提供的API,需要实现javax.servlet.Filter接口.过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletRe ...

  6. 「深入源码」Spring拦截器的实现原理和执行机制

    我一直以为Spring的拦截器是基于AOP原理实现的,仔细阅读完源码,才知道自己的认知是错误的. 今天我们就从源码的角度剖析下Spring拦截器. 一.创建一个自己的拦截器 实现一个自己的拦截器,需要 ...

  7. Spring拦截器的实现以及通过注解实现拦截

    五 本篇是本人记录对于Spring的拦截器简单的使用记录,以及通过自定义注解的方式实现其拦截目的 首先看一下简单的实现 第一步:定义一个测试类,用于向后台发送请求 @RestController pu ...

  8. Spring拦截器校验Json格式参数

    Json已经成为一种主流的数据传输格式,请求参数是整个RequestBody. 那么,拦截器中如何获取Json呢? 办法是:通过request.getInputStream. RequestBody是 ...

  9. spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法

    一.前言 由于业务需要,在网上找了很久得到了这两种方式.本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看. 二.Spring拦截器传递参数到controller 下面是我拦截器中的 ...

最新文章

  1. Spring-RedisTemplate原理
  2. Java寻找最大公约数
  3. 单链表之无头和有头--逆序
  4. clion修改选中行的背景颜色
  5. meta http-equiv=refresh content=3 什么意思?
  6. np.c_和np.r_
  7. WORD里的背景水印为什么怎么也删除不了呢?
  8. 【优化求解】基于matlab NSGA2算法多技能员工调度优化模型【含Matlab源码 1775期】
  9. 心形图案爱心代码编程c语言
  10. CorelDRAWX4的VBA插件开发(八)更改尺寸与移动
  11. velocity参数重新赋值_Velocity 语法详解
  12. inav是什么意思?
  13. PDF格式转JPG格式怎么转?掌握方法其实很简单
  14. html自动排版 vs,Visual Stidio Code (vscode)自定义HTML页面自动生成格式
  15. Elastic Search(搜索引擎)
  16. 压力单位PSI,PSIG, PSIA的区别
  17. mysql(8.0.28)设置开机自启动
  18. 分享自学编程收藏的网站学习资源
  19. 2025年,我的人生全被互联网巨头垄断了
  20. [源码和文档分享]基于QT实现的旅游路线查询系统

热门文章

  1. DirectDraw播放中BLT failed与Lock失败问题
  2. gather() 的函数功能
  3. 面试题:线程是什么?多线程
  4. tedu斌-Web笔记2112-4
  5. 小Y的Python学习日志--数据类型
  6. Echarts x轴,y轴,文字大小设置.
  7. 名帖369 康里巎巎 草书《李白古风诗卷》
  8. hkt java 怎么转换_Java基础教程——转换流
  9. 全角假名转换半角假名+验证是否为半角假名
  10. 8c sql手册 二