当前位置:网站首页>十一、拦截器运行原理
十一、拦截器运行原理
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~
边栏推荐
- 【Multisim仿真】直流稳压电源设计报告
- BFC详解(Block Formmating Context)
- IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.
- OSPF网络类型
- 吞吐?带宽?傻傻分不清楚
- 【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
- It turns out that the MAE proposed by He Yuming is still a kind of data enhancement
- 【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)
- [After a 12] No record for a whole week
- spingboot 容器项目完成CICD部署
猜你喜欢
CVPR2020 - 自校准卷积
解决:Unknown column ‘id‘ in ‘where clause‘ 问题
flink部署操作-flink standalone集群安装部署
CVPR2021 - Inception Convolution with Efficient Dilation Search
OSPF网络类型
网络ID,广播地址,掩码位数计算
[Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)
5G中切片网络的核心技术FlexE
读论文- pix2pix
Comparison and summary of Tensorflow2 and Pytorch in terms of basic operations of tensor Tensor
随机推荐
Flink Distributed Cache 分布式缓存
【数据库和SQL学习笔记】5.SELECT查询3:多表查询、连接查询
ACL 的一点心得
关于基于若依框架的路由跳转
SharedPreferences and SQlite database
伪RTOS-ProroThread在CH573芯片上的移植
SharedPreferences和SQlite数据库
MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
发顶会顶刊论文,你应该这样写作
如何编写一个优雅的Shell脚本(一)
Machine Learning (1) - Machine Learning Fundamentals
Oracle压缩表修改字段的处理方法
It turns out that the MAE proposed by He Yuming is still a kind of data enhancement
2021电赛资源及经验总结
「实用」运维新手一定不能错过的17 个技巧
[Go through 9] Convolution
WCH系列芯片CoreMark跑分
基于Flink CDC实现实时数据采集(四)-Sink接口实现
MSRA提出学习实例和分布式视觉表示的极端掩蔽模型ExtreMA
【22李宏毅机器学习】课程大纲概述