来看看哆啦a梦是如何使用拦截器

简介: 来看看哆啦a梦是如何使用拦截器

1.拦截器

SpringMVC的拦截器Interceptor类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

比如:可以实现:权限控制、日志、异常记录、记录方法执行时间…


1.1 拦截器的定义

在Spring MVC中使用拦截器,需要对拦截器类进行定义和配置。一般拦截器可以通过两种方式类定义。


一种是通过实现HandlerInterceptor接口或继承该接口的实现类来定义;

一种是通过实现WebRequestInterceptor接口或继承该接口的实现类来定义。

下面我们以实现HandlerInterceptor接口的方式来自定义拦截器类:

@Component
public class MyFirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyFirstInterceptor=====================>preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyFirstInterceptor=====================>postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyFirstInterceptor=====================>afterCompletion");
    }
}

可以看出自定义的拦截器类实现了HandlerInterceptor接口,并重写了接口中的三个方法。


1.2 拦截器的方法

拦截器有3个回调方法:


preHandle: 预处理回调方法,实现处理器的预处理,第三个参数为响应的处理器返回值:true表示继续向下执行(如调用下一个拦截器);false表示中断后续操作,不会继续调用其他的拦截器和控制器类的方法执行。


postHandle: 后处理回调方法,实现处理器的后处理,在渲染视图之前,此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理。


afterCompletion: 整个请求处理完成,即在视图渲染结束之后执行,可以通过该方法进行一些资源清理,类似于try­catch­finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器才会执行。


1.3 拦截器的配置

想要使自定义的拦截器类生效,还需要在Spring MVC的配置文件中进行配置。


我们通过<mvc:interceptors>元素来配置一组拦截器,若要拦截DispatcherServlet处理的所有请求,则如下面配置:

<!--配置拦截器-->
<mvc:interceptors>
    <!--1.对DispatcherServlet处理的所有请求进行拦截-->
  <bean class="com.it.interceptor.MyFirstInterceptor"/>
  <ref bean="myFirstInterceptor"/>
</mvc:interceptors>

当然,我们也可以通过<mvc:interceptors>的子元素<mvc:interceptor>来定义指定路径的拦截器,他会对指定路径下的请求生效。

<mvc:interceptors>
    <mvc:interceptor>
      <!--配置拦截器作用的路径,path的属性值“/**”表示拦截所有路径-->
         <mvc:mapping path="/**"/>
         <!--配置拦截请求中不需要拦截的请求-->
         <mvc:exclude-mapping path="/interceptor"/>
         <ref bean="myFirstInterceptor"/>
     </mvc:interceptor>
</mvc:interceptors>

注意:<mvc:interceptor>元素中的子元素的配置顺序不能变。


1.4 定义多个拦截器

1.4.1 添加另一个拦截器

@Component
public class MySecondInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MySecondInterceptor=================>preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MySecondInterceptor==================>postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MySecondInterceptor=============>afterCompletion");
    }
}

1.4.2 配置拦截器

<mvc:interceptors>
    <ref bean="myFirstInterceptor"/>
    <ref bean="mySecondInterceptor"/>
</mvc:interceptors>

可以看到如下图所示的执行顺序:

image.png


从上面能够看到,若每个拦截器的preHandle()都返回true,则preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行。


若某个拦截器的preHandle()返回了false,那么preHandle()返回false和它之前的拦截器的preHandle()都会执行,而postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行。也就是已经通过的拦截器的afterCompletion会执行。


1.4.1 示例

比如:我们将第二个拦截器的preHandle方法的返回值改为false,可以看到preHandle方法都执行了,postHandle没有执行,而afterComplation只执行了第一个拦截器的。

image.png


1.5 拦截器的执行流程

1.5.1 单个拦截器执行流程

单个拦截器,程序会首先执行拦截器类中的preHandle()方法,若该方法返回true,则继续向下执行处理器中的方法,否则中断;处理完请求之后会执行postHandle()方法,然后再通过DispatcherServlet请求处理之后,最后执行afterComplation()方法。


1.5.2 多拦截器执行流程

多个拦截器同时工作时,每个拦截器的preHandle()方法都会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行。

image.png

相关文章
|
8天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
7天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
346 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
19天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1331 8
|
7天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
333 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
6天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
18天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1421 87
|
6天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。