当前位置:网站首页>十一、拦截器运行原理
十一、拦截器运行原理
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 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)
- 读论文- pix2pix
- 如何停止flink job
- Flink Broadcast 广播变量
- 伪RTOS-ProroThread在CH573芯片上的移植
- 轻松接入Azure AD+Oauth2 实现 SSO
- Mesos learning
- 基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)
- 【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
- Service
猜你喜欢
ECCV2022 | RU&谷歌提出用CLIP进行zero-shot目标检测!
Facial Motion Capture 调研
Flink HA配置
Flutter 3.0升级内容,该如何与小程序结合
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
网络信息安全运营方法论 (上)
PoE视频监控解决方案
Flink Table API 和 SQL之概述
Flink EventTime和Watermarks案例分析
读论文 - Unpaired Portrait Drawing Generation via Asymmetric Cycle Mapping
随机推荐
Flink HA配置
关于基于若依框架的路由跳转
如何编写一个优雅的Shell脚本(二)
用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!
CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
伪RTOS-ProroThread在CH573芯片上的移植
网络ID,广播地址,掩码位数计算
[Pytorch study notes] 11. Take a subset of the Dataset and shuffle the order of the Dataset (using Subset, random_split)
BroadCast Receiver(广播)详解
flink实例开发-详细使用指南
Comparison and summary of Tensorflow2 and Pytorch in terms of basic operations of tensor Tensor
记我的第一篇CCF-A会议论文|在经历六次被拒之后,我的论文终于中啦,耶!
el-pagination左右箭头替换成文字上一页和下一页
华科提出首个用于伪装实例分割的一阶段框架OSFormer
[Database and SQL study notes] 8. Views in SQL
服务网格istio 1.12.x安装
Oracle压缩表修改字段的处理方法
基于STM32F4的FFT+测频率幅值相位差,波形显示,示波器,时域频域分析相关工程
【Multisim仿真】直流稳压电源设计报告
flink部署操作-flink standalone集群安装部署