广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot拦截器源码分析
  • 826
分享到

SpringBoot拦截器源码分析

2023-06-08 06:06:41 826人浏览 薄情痞子
摘要

本文小编为大家详细介绍“SpringBoot拦截器源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“springBoot拦截器源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、拦截器是什么java里

本文小编为大家详细介绍“SpringBoot拦截器源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“springBoot拦截器源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1、拦截器是什么

java里的拦截器(Interceptor)是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在aop中,拦截器用于在某个方法或者字段被访问之前进行拦截,然后再之前或者之后加入某些操作。

上面的Action一般指的就是我们Controller层的接口。

2、自定义拦截器

一般自定义一个拦截器分为三步

(1)编写一个拦截器实现HandlerInterceptor接口。

(2)拦截器注册到容器中。

(3)配置拦截规则。

2.1 编写拦截器

我们新建一个SpringBoot项目,然后自定义一个拦截器LoginInterceptor,拦截未登录状态下的某些请求。jdk1.8开始,接口的方法加上default关键字可以有默认实现,所以实现一个接口只需要实现没有加该关键字的方法。

import lombok.extern.slf4j.Slf4j;import org.springframework.WEB.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.Http.httpservletRequest;import javax.servlet.http.HttpServletResponse;@Slf4jpublic class LoginInterceptor implements HandlerInterceptor {        @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        // 获取请求路径        String requestUrl = request.getRequestURI();        log.info("请求的路径是: {}", requestUrl);        String username = request.getParameter("username");        if (username != null) {            // 放行            return true;        }        request.setAttribute("msg", "请先登录");        // 携带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执行");    }        @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        log.info("afterCompletion执行");    }}

2.2 注册和配置拦截器

在SpringBoot中,我们需要自定义配置的时候,只需要实现WebmvcConfigurer类重写对应的方法即可。这里我们需要配置拦截器,那么重写它的addInterceptors方法即可。

import com.codeliu.interceptor.LoginInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorReGIStry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;// 表示这是一个配置类@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new LoginInterceptor())                .addPathPatterns("boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {    // 遍历拦截器    for (int i = 0; i < this.interceptorList.size(); i++) {        HandlerInterceptor interceptor = this.interceptorList.get(i);        // 执行当前拦截器的preHandle方法        if (!interceptor.preHandle(request, response, this.handler)) {            // 如果preHandle方法返回为false,则执行当前拦截器的afterCompletion方法            triggerAfterCompletion(request, response, null);            return false;        }        // 记录当前拦截器的下标        this.interceptorIndex = i;    }    return true;}

通过上面的代码, 我们知道如果当前拦截器的preHandle方法返回为true,则会继续执行下一拦截器的preHandle方法,否则执行拦截器的afterCompletion方法。

那么我们看看triggerAfterCompletion方法的逻辑。

void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex) {    // 反向遍历拦截器    for (int i = this.interceptorIndex; i >= 0; i--) {        HandlerInterceptor interceptor = this.interceptorList.get(i);        try {            // 执行当前拦截器的afterCompletion方法            interceptor.afterCompletion(request, response, this.handler, ex);        }        catch (Throwable ex2) {            logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);        }    }}

通过上面的代码,我们知道对于拦截器的afterCompletion方法,是反向执行的。

3.3 执行目标方法

如果上面拦截器的所有preHandle方法返回都为true,那么在doDispatch方法内就不会直接return,而是继续往下执行目标方法。如果任何一个拦截器的preHandle方法返回为false,那么执行完拦截器(已经执行过preHandle方法的拦截器)的afterCompletion方法后,在doDispatch方法内会直接return,不会执行目标方法。

通过下面的代码执行目标方法

// Actually invoke the handler.mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

内部具体怎么执行的就不看了,看看执行完后的逻辑。

3.4 执行拦截器的postHandle方法

目标方法执行完后,代码往下走

mappedHandler.applyPostHandle(processedRequest, response, mv);

查看applyPostHandle的逻辑

void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv)    throws Exception {// 反向遍历    for (int i = this.interceptorList.size() - 1; i >= 0; i--) {        HandlerInterceptor interceptor = this.interceptorList.get(i);        // 执行当前拦截器的postHandle方法        interceptor.postHandle(request, response, this.handler, mv);    }}

倒序执行拦截器的postHandle方法

3.5 执行拦截器的afterCompletion方法

继续往下走

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

进入该方法,该方法会处理执行结果,渲染页面,该方法的最后,执行下面的代码

SpringBoot拦截器源码分析

3.6 异常处理

如果在执行doDispatch方法过程中,抛出了异常,在catch模块,都会触发执行afterCompletion方法

SpringBoot拦截器源码分析

读到这里,这篇“SpringBoot拦截器源码分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: SpringBoot拦截器源码分析

本文链接: https://www.lsjlt.com/news/252589.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot拦截器源码分析
    本文小编为大家详细介绍“SpringBoot拦截器源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot拦截器源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、拦截器是什么java里...
    99+
    2023-06-08
  • SpringBoot拦截器以及源码详析
    目录1、拦截器是什么2、自定义拦截器2.1 编写拦截器2.2 注册和配置拦截器3、拦截器原理3.1 找到可以处理请求的handler以及handler的所有拦截器3.2 执行拦截器的...
    99+
    2022-11-12
  • SpringBoot拦截器与文件上传实现方法与源码分析
    目录一、拦截器1、创建一个拦截器2、配置拦截器二、拦截器原理三、文件上传四、文件上传流程一、拦截器 拦截器我们之前在springmvc已经做过介绍了 大家可以看下【SpringMVC...
    99+
    2022-11-13
  • SpringBoot拦截器实现登录拦截
    SpringBoot拦截器可以做什么可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。SpringBoot拦截器实现登录拦截pom.xml: 4.0.0 org.s...
    99+
    2015-07-20
    java教程 Spring Boot java
  • SpringBoot拦截器实现登录拦截的示例代码
    可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等  实现代码 新建 interceptor包 添加拦截器代码 package c...
    99+
    2022-11-13
  • 【mybatis】mybatis 拦截器工作原理源码解析
    mybatis 拦截器工作原理(JDK动态代理) 1. mybatis 拦截器案例 场景:分页查询,类似成熟产品:pagehelper, 这里只做简单原理演示 1.0 mybatis全局配置 SqlMapConfig.xml ...
    99+
    2015-01-18
    【mybatis】mybatis 拦截器工作原理源码解析
  • OKhttp拦截器实现实践环节源码解析
    目录正文拦截器的自我实现RetryAndFollowUpInterceptorBridgeInterceptorCacheInterceptorConnectInterceptorC...
    99+
    2023-01-05
    OKhttp 拦截器 OKhttp 拦截器实践
  • spring boot 2.x静态资源会被拦截器拦截的原因分析及解决
    目录spring boot 2.x静态资源会被拦截器拦截的原因自定义HandlerInterceptor拦截器源码如下配置如下访问静态资源时路径上不用加static目录总结sprin...
    99+
    2023-01-12
    springboot2静态资源 静态资源被拦截 拦截器拦截静态资源
  • SpringBoot过滤器与拦截器深入分析实现方法
    目录过滤器编写过滤器注册过滤器基于 FilterRegistrationBean基于 @WebFilter拦截器过滤器 实现过滤器需要实现 javax.servlet.Filter ...
    99+
    2022-11-13
    SpringBoot过滤器与拦截器 SpringBoot过滤器 SpringBoot拦截器
  • SpringBoot过滤器与拦截器使用方法深入分析
    目录什么是过滤器什么是拦截器拦截器与过滤器的区别什么是过滤器 过滤器 Filter 基于 Servlet 实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet ...
    99+
    2022-12-27
    SpringBoot过滤器 SpringBoot拦截器
  • axios拦截器工作方式及原理源码解析
    目录axios 拦截器的配置方式use() 方法的定义拦截器如何执行拦截器回调方法的添加顺序同步执行请求拦截器(顺序执行)异步执行请求拦截器(同时执行)Q&A拦截器是如何工作...
    99+
    2023-02-10
    axios拦截器工作原理 axios 拦截器
  • Java SpringBoot拦截器详解
    目录1. 拦截器2. 拦截器使用2.1 准备工作2.2 Controller2.3 Interceptor2.4 Config2.5 测试2.5.1 正常登录2.5.2 非正常登录2...
    99+
    2022-11-12
  • SpringBoot拦截器的使用
    目录一、拦截器简介二、拦截器配置使用方式1、过滤器拦截器作用范围2、拦截器的使用三、知识点总结1、拦截器的使用2、拦截器和过滤器的相同与不同一、拦截器简介 拦截器通常通过动态代理的方...
    99+
    2022-11-12
  • SpringBoot拦截器怎么用
    今天小编给大家分享一下SpringBoot拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。HandlerInter...
    99+
    2023-06-08
  • 如何使用SpringBoot拦截器实现登录拦截
    小编给大家分享一下如何使用SpringBoot拦截器实现登录拦截,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!可以对URL路径进行拦截,可以用于权限验证、解决乱码...
    99+
    2023-06-29
  • springboot过滤器和拦截器的实例代码
    拦截器与过滤器   在讲Spring boot之前,我们先了解一下过滤器和拦截器。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的。在分析两者的区别之前,我们先理解一...
    99+
    2022-11-12
  • SpringBoot实现过滤器拦截器的耗时实例对比分析
    本篇内容介绍了“SpringBoot实现过滤器拦截器的耗时实例对比分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!过滤器的方式这种方式简单...
    99+
    2023-07-02
  • 全面了解SpringBoot拦截器
    在本文中,我们将详细介绍SpringBoot中的拦截器,包括拦截器的概念、作用、实现方式、执行顺序、生命周期以及高级应用。最后,我们还将探讨拦截器的性能优化策略和常见问题。 1. 拦截器的概念和作用 1.1 什么是拦截器 拦截器(Inter...
    99+
    2023-08-19
    spring boot spring java 原力计划
  • SpringBoot拦截器使用精讲
    目录定义拦截器注册拦截器指定拦截规则实现登陆功能验证登陆及登陆拦截功能我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 U...
    99+
    2022-11-12
  • SpringBoot拦截器有什么用
    这篇文章主要为大家展示了“SpringBoot拦截器有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot拦截器有什么用”这篇文章吧。HandlerInterceptor 详...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作