IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot:拦截器的实现原理 ---- 12 -> 正文阅读

[Java知识库]SpringBoot:拦截器的实现原理 ---- 12

拦截器的实现原理

ssss对于拦截器的实现原理,其实是非常简单的,在前几篇文章我们已经分析了,请求映射原理最核心的方法是 doDispatch(request, response),因此我们通过 deBug 方式在doDispatch处打断点学习具体的参数处理是如何工作的,其中的核心方式有获取处理器执行器,映射器,执行目标方法,页面渲染等。 在这其中,其实还穿插着一些拦截器的相关方法执行。

自定义拦截器的实现步骤

ssdsadssdas在这里插入图片描述
dsdssss我们可以发现,拦截器是一个接口,一共有三个方法,我们可以重写这三个方法,对其进行自定义拦截。

dssss①、编写HandlerInterceptor接口

@Slf4j
@Configuration
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行之前* @param request* @param response* @param handler* @return* @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();
        log.info("preHandle()拦截的请求路径是()"+requestURI);
        //登陆检查逻辑
        HttpSession session = request.getSession();

        Object loginUser = session.getAttribute("loginUser");

        if(loginUser!=null){
            //放行
            return true;
        }

        //拦截住(未登录),跳转到登录页
        request.setAttribute("msg","请先登陆");
        request.getRequestDispatcher("/").forward(request,response);
        return false;
    }
    /**
     * 目标方法执行之后* @param request* @param response* @param handler* @param modelAndView* @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle执行{}",modelAndView);
    }
    /**
     * 页面渲染之后 * @param request* @param response* @param handler* @param ex * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion执行异常{}",ex);
    }
}

dsss【注 1】:

dsdsssspreHandle():是执行目标方法前,执行该方法(通过方法的参数值也可以发现 -->request、response、handle)

dsdsssspostHandle():执行完成目标方法后,页面渲染前,有了返回的ModelAndView后,执行该方法。(参 -->request、response、handle、modelAndView)

dsdssssafterCompletion():页面渲染完后,执行该方法,其实主要是为了显示异常。(参:request、response、handler、ex)
dsss【注 2】:如果没有异常,三个方法按 [注 1] 中所写执行,但如果执行过程中出现异常,则改变执行顺序,具体在原理中讲。
dsdssss
dssss②、 配置拦截器

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
    /**
     * 1、编写一个拦截器实现HandlerInterceptor接口
     * 2、拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
     * 3、指定拦截规则【如果是拦截所有,静态资源也会被拦截
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")     //静态所有请求都被拦截,包括静态资源
                .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); //放行的请求
    }
}

dssss③、拦截器执行顺序
dsdsdsdsddsss在这里插入图片描述

拦截器原理

ssss没有异常的执行流程图解:
sssadssdas在这里插入图片描述
ssss代码分析:
sdsss在这里插入图片描述
sds由上图我们可知,③,⑤,⑦是我们拦截器的三个方法。我们根据deBug依次看不同的方法逻辑:

sddss①、根据当前请求,找到HandlerExecutionChain【可以处理当前请求的handler以及handler的所有拦截器】
sddds在这里插入图片描述
sddss②、HandlerAdapter - 为当前Handler 找一个适配器

sddss③、先来 顺序执行 所有拦截器的 preHandle方法,如果其中有失败的,则逆序执行相应的afterCompletion()方法。
sdsdssssss在这里插入图片描述
sdsdssssss在这里插入图片描述
dsdsss【注】:注意逆序执行afterCompletion,有一个小细节,我们用this.interceptorIndex==i++或者–i,说明只有执行完preHandle()方法的拦截器才能逆序执行响应的afterCompletion方法。执行完后,doDispatch()方法就直接return,不会执行目标方法了。

sddss④、所有拦截器都返回True。执行目标方法。
sdsd ddss在这里插入图片描述
sddss⑤、 倒序执行所有拦截器的postHandle方法。
dsdssdds在这里插入图片描述
dsdssdd在这里插入图片描述
sddss⑥、渲染页面。

sddss⑦、页面渲染完成后也会触发所有拦截器的 afterCompletion(通过finally里的方法可以得知这一点)。
sddssdsds在这里插入图片描述
sddsdsdss并且前面的步骤有任何异常都会直接倒序触发所有拦截器的 afterCompletion。
在这里插入图片描述
dsdsss【注】:到此doDispatch()方法就结束了,拦截器的三个方法中 afterCompletion 和 preHandle 一定执行。
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:42:35  更:2021-11-15 15:42:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:41:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码