当前位置:网站首页>十一、拦截器运行原理
十一、拦截器运行原理
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~
边栏推荐
- 【Pytorch学习笔记】8.训练类别不均衡数据时,如何使用WeightedRandomSampler(权重采样器)
- 常见的 PoE 错误和解决方案
- flink基本原理及应用场景分析
- 如何编写一个优雅的Shell脚本(三)
- Flink Table API 和 SQL之概述
- The difference between the operators and logical operators
- Machine Learning (1) - Machine Learning Fundamentals
- 网络信息安全运营方法论 (中)
- 【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)
- 单变量线性回归
猜你喜欢

flink项目开发-flink的scala shell命令行交互模式开发

CVPR2020 - 自校准卷积

【数据库和SQL学习笔记】7.SQL中的插入(INSERT)、删除(DELETE)、更新(UPDATE)

物联网:LoRa无线通信技术

2022年中总结关键词:裁员、年终奖、晋升、涨薪、疫情

CVPR 2022 |节省70%的显存,训练速度提高2倍

【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera

基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)

6k+ star,面向小白的深度学习代码库!一行代码实现所有Attention机制!

Flink Table API 和 SQL之概述
随机推荐
如何编写一个优雅的Shell脚本(二)
Comparison and summary of Tensorflow2 and Pytorch in terms of basic operations of tensor Tensor
基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)
物联网:LoRa无线通信技术
Flink EventTime和Watermarks案例分析
MySql之索引
AIDL详解
Day1:用原生JS把你的设备变成一台架子鼓!
【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
el-pagination左右箭头替换成文字上一页和下一页
[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
spark-DataFrame数据插入mysql性能优化
flink yarn-session的两种使用方式
It turns out that the MAE proposed by He Yuming is still a kind of data enhancement
【论文精读】R-CNN 之预测框回归(Bounding box regression)问题详述
Flink Broadcast 广播变量
网络信息安全运营方法论 (中)
伪RTOS-ProroThread在CH573芯片上的移植
如何跟踪网络路由链路&检测网络健康状况
PoE视频监控解决方案