请你谈谈:spring拦截器的应用-preHandle postHandle afterCompletion执行顺序问题的讨论?

news2024/9/24 7:14:37

首先我们,给出一个demo来看下拦截器方法执行顺序:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1-1 preHandle: ");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("2-1 postHandle: ");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("3-1 afterCompletion: ");
    }
}

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebmvcConfig implements WebMvcConfigurer {
    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor);
    }
}

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        System.out.println("controller:");
        return "hello, zhaoshuai-lc";
    }
}

在这里插入图片描述
在Spring MVC中,拦截器(Interceptor)的三个主要方法preHandlepostHandleafterCompletion的执行顺序是严格规定的,这些方法的执行时机和顺序对于理解Spring MVC的请求处理流程至关重要。以下是这三个方法的执行顺序的详细解释:

执行顺序

  1. preHandle

    • 调用时间:该方法在请求处理之前执行,即Controller方法调用之前。
    • 执行顺序:如果有多个拦截器,它们会按照配置的顺序(即拦截器数组中的正向顺序)依次执行。
    • 返回值
      • 返回true:表示当前拦截器处理通过,请求会继续传递给下一个拦截器(如果有的话),或者如果没有其他拦截器了,就会传递给Controller处理。
      • 返回false:表示当前拦截器拦截请求,不会继续执行后续的拦截器或Controller方法,而是直接中断执行流程,并会根据情况(如配置)执行afterCompletion方法(但需要注意的是,不是所有返回false的拦截器都会执行afterCompletion,这取决于拦截器的具体配置和是否发生异常)。
      • 在这里插入图片描述
        在这里插入图片描述
  2. postHandle

    • 调用前提preHandle方法必须返回true,即请求被正常放行到Controller方法执行之后,但在DispatcherServlet进行视图渲染之前。
    • 调用时间:Controller方法处理完请求并返回ModelAndView之后,但在视图渲染之前。
    • 执行顺序:如果有多个拦截器,它们会按照配置的逆序(即拦截器数组的反向顺序)执行。
    • 注意:如果Controller方法执行过程中抛出异常,将跳过postHandle方法,直接执行afterCompletion方法。

总结

方法名调用时机执行顺序(多个拦截器时)主要作用
preHandle请求处理之前,Controller方法调用之前正向顺序决定是否继续执行后续的拦截器或Controller
postHandleController方法处理完请求后,视图渲染前反向顺序(如果执行)对ModelAndView进行操作(如果需要)
afterCompletion(错误说法)整个请求处理结束之后,包括视图渲染之后反向顺序资源清理工作,如关闭数据库连接等

这个执行顺序和规则是Spring MVC框架中拦截器机制的核心,理解和掌握它们对于开发高质量的Web应用至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1966393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一百八十五节 Java XML教程 - Java DOM简介

Java XML教程 - Java DOM简介 DOM是标准的树结构,其中每个节点包含来自XML结构的一个组件。 XML文档中两种最常见的节点类型是元素节点和文本节点。 使用Java DOM API,我们可以创建节点,删除节点,更改其内容,并遍历节…

TypeScript 定义不同的类型(详细示例)

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

抖音评论爬虫数据采集|抖音评论抓取工具|代码|源码

抖音评论提取软件使用说明 抖音视频评论提取到的内容:1:视频名称 2:视频作者 3:作者地址 4:视频地址 5:评论人昵称。6:评论人主页地址。7:评论内容 8:评论日期 软件支持…

我是客服新手,打字很慢,怎么办?

作为客服新手,打字速度缓慢可能影响工作效率,本文介绍了提高打字速度,以及使用聊天宝快捷回复工具等提效的诀窍 前言 我是客服新手,打字速度缓慢可能影响工作效率。本文将分享如何提高客服打字速度,包括使用聊天宝快捷…

协助我们进行论文写作的ChatGPT们究竟是如何工作的?

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 大型语言模型(LLMs)正在彻底改变我们与人工智能的互动方式,特别是在写作和创作领域。这些先进的人工智能系统不仅在改变作家和创作者的格局&#xff…

<数据集>遥感航拍飞机识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2398张 标注数量(xml文件个数):2398 标注数量(txt文件个数):2398 标注类别数:1 标注类别名称:[plane] 序号类别名称图片数框数1plane239815178 使用标注工具&#…

多微信管理不再难:聚合聊天神器助你轻松应对!

在当今社交媒体高度发达的时代,很多人都在使用多个微信账号来管理个人与工作联系。面对如此众多的信息沟通,如何高效管理成了一个难题。 幸运的是,聚合聊天神器的出现,彻底改变了这一局面,让我们轻松应对多微信账号的…

Flutter+Android/ios 桌面小组件

FlutterAndroid/ios 桌面组件 总结: Android和iOS 桌面小组件 需要原生去绘制小组件和更新数据,Flutter层 可以使用 MethodChannel 与原生 通信 来控制 更新数据,app无法主动控制 小组件的添加 和 删除, 只能是用户手动操作 。小…

利率虽降,贷款依旧难?政策暖风下的融资冷思考

​朋友们,最近听到不少人在吐槽贷款难的问题,咱们就来聊聊这背后的故事。你们知道吗?深圳的朱先生可是为这事儿头疼不已。他的公司急需一笔钱来结清货物尾款,可前一年的经营状况不佳,备用金早就见底了。朱先生四处求人…

随机化快速排序 python C C++ 图解 代码 及解析

一,概念及其介绍 快速排序由 C. A. R. Hoare 在 1960 年提出。 随机化快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别…

真假公主:一场容貌相似引发的宫廷阴谋

真假公主:一场容貌相似引发的宫廷阴谋 从古至今,每个人的心思都不相同,正如他们的面貌各不相同一样。即使人们的外貌没有明显的差异,但他们的内心和性格却是难以改变的。 话说人的面貌是最为独特的,因为每个人都是由不…

LNMP黄金架构搭建部署论坛网站

哈哈哈哈哈我终于部署出来了一个属于自己的论坛,虽然不怎么懂 部署Linux环境 关闭防火墙Systemctl stop firewalldSystemctl disable firewalld关闭selinuxSetence 0查看selinuxGeteforce 部署nginx环境 Yum i install httpd过滤apache的端口号看是否有80端口N…

移动自组织网络(MANET)与互联网连接的网关选择方案文献综述

以下内容节选自这篇综述论文《Gateway Selection Scheme for MANET to Internet Connectivity: A Survey》由Ritu Singh和Jay Prakash撰写,主要探讨了移动自组织网络(MANET)与互联网连接的网关选择方案。 在接下来的部分中,我们对…

gstreamer实现视频的3D旋转(一)的实现思路

效果: 一、实现思路 首先我们要知道,gstreamer有OpenGL相关的插件,网址如下: GstOpengl (gstreamer.freedesktop.org) 其中,有不少有趣的插件,比如我发现的gltransformation插件,可以实现OpenG…

甄选范文“论层次式架构在系统中的应用”软考高级论文系统架构设计师论文

论文真题 层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架构的理解和应用是软件工程师必备的技能之一…

普元Devops学习笔记-devops对接jenkins提示crumb不可用问题

前言 普元devops需要对接jenkins,对接jenkins后,devops会调用jenkins的提供的API。 问题 新版本的jenkins提供跨域保护,即大名鼎鼎的CSRF问题。 因此,普元devops调用jenkins的时候,会出现跨域问题。 后台报错信息如…

Python Socket 编程基础

在计算机网络的世界里,Socket 编程是实现不同计算机之间通信的一种基础而强大的方式。Python 作为一种广泛使用的编程语言,其内置的 socket 库使得进行网络编程变得简单而直观。本文将带你走进 Python Socket 编程的世界,通过构建简单的客户端…

若依分离版本部署流程—开启HTTPS访问。

目录 前言 一、申请证书 二、后端打包 三、前端打包 四、服务器部署 ① Redis启动 ② 运行Jar包 ③ 上传ssl证书到服务器 ④ Nginx配置前端部分 五、访问 前言 在若依分离版本的项目部署过程中,跟大多数前后端分离项目差不多,都是前后端分别打包到服…

大型边缘物联平台实战系列01-为什么我们放弃Springboot选择了Nestjs?

引言 我真的很爱Nestjs,那是一种很纯粹、很理性的爱,四年了,我每天都在用它…哦,不对,是我们都在用它。 四年前,在那场剑拔弩张的技术选型会议上,经过十几轮Battle,楼主力排众议将…

MySQL:ORDER BY 排序查询

通过 ORDER BY 条件查询语句可以查询到符合用户需求的数据,但是查询到的数据一般都是按照数据最初被添加到表中的顺序来显示。 基本语法 在MySQL中,排序查询主要通过ORDER BY子句实现。其基本语法如下: SELECT column1, column2, ... FR…