当前位置:网站首页>十一、拦截器运行原理
十一、拦截器运行原理
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~
边栏推荐
猜你喜欢
网络信息安全运营方法论 (下)
发顶会顶刊论文,你应该这样写作
CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
关于存储IOPS你必须了解的概念
SQL (2) - join window function view
[After a 12] No record for a whole week
【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
【数据库和SQL学习笔记】10.(T-SQL语言)函数、存储过程、触发器
You should write like this
原来何恺明提出的MAE还是一种数据增强
随机推荐
【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
Tensorflow踩坑笔记,记录各种报错和解决方法
Flink EventTime和Watermarks案例分析
[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
【Over 15】A week of learning lstm
tensorflow的session和内存溢出
如何编写一个优雅的Shell脚本(三)
【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
数控直流电源
【论文精读】R-CNN 之预测框回归(Bounding box regression)问题详述
Thread handler handle IntentServvice handlerThread
[Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)
OSPF网络类型
用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!
C语言联合体union占用空间大小问题
服务网格istio 1.12.x安装
大型Web网站高并发架构方案
基于Flink CDC实现实时数据采集(二)-Source接口实现
CVPR2020 - 自校准卷积