当前位置:网站首页>十一、拦截器运行原理
十一、拦截器运行原理
2022-08-05 05:16:00 【呆比特】
拦截器运行原理
在讲原理之前,先来看一下拦截器是怎样使用的,比如我们现在要做登录检查
第一步:编写一个拦截器实现HandlerInterceptor接口
public class LoginInterceptor implements HandlerInterceptor {
//目标方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
//登录检查逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null){
//放行
return true;
}
//拦截住。未登录。跳转到登录页
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
//目标方法执行完成以后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}",modelAndView);
}
//页面渲染以后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}",ex);
}
}
第二步:拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
@Configuration
public class AdminWebConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") //所有请求都被拦截包括静态资源
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**",
"/js/**"); //放行的请求
}
}
重点就是在 addInterceptors 中指定好拦截规则。
使用非常简单,接下来过一下它的执行流程,看看它底层是怎么实现的
给 DispatcherServlet 的 doDispatch 打上断点,发起请求

然后获取一个执行链,包括我们的处理器方法和拦截器
继续往下
继续,来到执行目标方法的前一步

你怎么知道那里边执行prehandle方法呢?我们 step into 进去看一下

下一步,if 判断里边就来到了我们自定义的拦截器
他会先来顺序执行 所有拦截器的 preHandle方法,如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle,如果当前拦截器返回为false。直接倒序执行所有已经执行了的拦截器的 afterCompletion
如果任何一个拦截器返回false。直接跳出不执行目标方法
我们是登录过的,所以返回true
如果返回false,就会进入下边的 triggerAfterCompletion 方法
所有拦截器都返回True,执行目标方法
然后接下来不在赘述中间的过程,直接让目标方法执行完
目标方法执行完,来到 applyPostHandle 方法,step into 进去

这里边倒序执行所有拦截器的postHandle方法。
执行完之后来到 processDispatchResult,说明一下,前面的步骤有任何异常都会直接倒序触发 afterCompletion ,如下

一切正常,就会来到页面渲染流程、
这也是前边分析过的,就不在赘述
页面成功处理完后,又会倒序触发 afterCompletion
倒序
这就是拦截器的运行原理,还是比较容易理解的!
总结为一张图

OVER(∩_∩)O~
边栏推荐
- 面向小白的深度学习代码库,一行代码实现30+中attention机制。
- 读论文- pix2pix
- IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.
- 伪RTOS-ProroThread在CH573芯片上的移植
- PoE视频监控解决方案
- The University of Göttingen proposed CLIPSeg, a model that can perform three segmentation tasks at the same time
- 6k+ star,面向小白的深度学习代码库!一行代码实现所有Attention机制!
- 「实用」运维新手一定不能错过的17 个技巧
- [Intensive reading of the paper] R-CNN's Bounding box regression problem is detailed
- Day1:用原生JS把你的设备变成一台架子鼓!
猜你喜欢

flink on yarn 集群模式启动报错及解决方案汇总

Flutter 3.0升级内容,该如何与小程序结合

flink部署操作-flink on yarn集群安装部署

服务网格istio 1.12.x安装

AIDL详解

flink项目开发-配置jar依赖,连接器,类库
![[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)](/img/71/f82e76085f9d8e6610f6f817e2148f.png)
[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)

ECCV2022 | RU&谷歌提出用CLIP进行zero-shot目标检测!

常见的 PoE 错误和解决方案

flink部署操作-flink standalone集群安装部署
随机推荐
【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
Flutter 3.0升级内容,该如何与小程序结合
《基于机器视觉测量系统的工业在线检测研究》论文笔记
[Practice 1] Diabetes Genetic Risk Detection Challenge [IFLYTEK Open Platform]
RecycleView和ViewPager2
吞吐?带宽?傻傻分不清楚
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
[After a 12] No record for a whole week
flink基本原理及应用场景分析
Service
Thread handler句柄 IntentServvice handlerThread
【数据库和SQL学习笔记】7.SQL中的插入(INSERT)、删除(DELETE)、更新(UPDATE)
初识机器学习
关于基于若依框架的路由跳转
[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
Tensorflow踩坑笔记,记录各种报错和解决方法
flink项目开发-flink的scala shell命令行交互模式开发
OSPF网络类型
常见的 PoE 错误和解决方案
基于STM32F4的FFT+测频率幅值相位差,波形显示,示波器,时域频域分析相关工程