What does `HandlerInterceptor` do?

HandlerInterceptorSpringMVC 中的一个接口,在SpringMVC应用中它提供了一种实现应用级拦截器的机制。

第1步:引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

第2步:定义拦截器

import com.zhangziwa.practisesvr.utils.response.ResponseContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class ResponsePostInterceptor implements HandlerInterceptor {

    # 在进入Controller执行之前调用
    # 该方法返回 true,则继续执行后续的Controller
    # 该方法返回 false,则中断,不会执行后续的Controller 和 Interceptor

	# 验证行为:登录验证、权限控制
	# 记录行为:性能监控、日志记录等操作
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	# 记录行为:比如此处为记录一下日志
        System.err.println("***ResponsePostInterceptor.preHandle***");
        
        return true;
    }

    # controller执行之后,页面渲染之前调用
    
	# 数据补充行为:对请求处理的结果(如 ModelAndView)进行进一步的修改或操作
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    	# 记录行为:比如此处为记录一下日志
        System.err.println("***ResponsePostInterceptor.postHandle***");
        
        # 数据补充行为:比如此处对HttpHeaders 和 HttpStatus 进行补充
        if (response.isCommitted()) {
            System.out.println("response is committed");
            return;
        }

        HttpHeaders headers = ResponseContext.getHeaders();
        if (headers != null) {
            headers.forEach((key, values) -> values.forEach((value) -> {
                if (!response.getHeaderNames().contains(key)) {
                    response.addHeader(key, value);
                }
            }));
        }

        if (ResponseContext.getResponseCode() != null) {
            response.setStatus(ResponseContext.getResponseCode().value());
        }
    }

    # 页面渲染之后调用,无论是否发生异常都会被调用
    # 数据清理行为:通常用于资源清理
    # 记录行为:记录请求结束时间等
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    	# 记录行为:比如此处为记录一下日志
        System.err.println("***ResponsePostInterceptor.afterCompletion***");
        
        # 数据清理行为:比如此处用于资源清理
        ResponseContext.clear();
    }
}

第3步:注册拦截器

注册后拦截器才正常使用,所以使用前要先注册,所谓注册就是放到指定地方,Spring就知道有这个拦截器了。

import com.zhangziwa.practisesvr.interceptor.ResponsePostInterceptor;
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 ResponsePostInterceptor responsePostInterceptor;

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

第4步:使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

***ResponsePostInterceptor.preHandle***
***Controller.getAllStudents4***
***ResponsePostInterceptor.postHandle***
***ResponsePostInterceptor.afterCompletion***

参考

springboot之HandlerInterceptor拦截器入门
Spring MVC拦截器HandlerInterceptor全解!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用 Azure Data Bricks的免费资源学习云上大数据

在这个数据驱动的时代&#xff0c;大数据和云计算已成为推动技术创新和商业智能的关键因素。Azure Databricks&#xff0c;作为一个先进的云平台&#xff0c;为那些渴望深入了解和掌握这些技术的人们提供了一个理想的学习环境。我们这里将利用 Azure Databricks 的免费资源&…

C语言进阶指南(22)——文件管理函数

欢迎来到博主的专栏——C语言进阶指南 博主id&#xff1a;代码小豪 文章目录 一、文件输入输出函数fwritefread 二、文件定位函数文件位置fseekftellrewind 三、文件缓冲区fflush 一、文件输入输出函数 这些函数用于文件流&#xff0c;主要功能是将一连串的数据输出或输入&am…

python24.1.13for循环

对列表、字典、字符串等进行迭代 range

关系型数据库和MySQL概述

关系型数据库概述 数据持久化 - 将数据保存到能够长久保存数据的存储介质中,在掉电的情况下数据也不会丢失。数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL 数据库、NewSQL 数据库。1970年,IBM的研究员E.F.Codd在_Communication of the ACM_上发表了名为_A Rela…

可盐可甜的红色马甲背心

膨体棉腈面料不易皱&#xff0c;搭配阿兰花菱形镂空设计 真的绝绝子&#xff0c;红色吸睛又美观 随便搭配一件衬衫去穿&#xff0c;自带文艺气息 氛围感直接拉满 出街拍照很出片&#xff0c;时髦又气质 女孩子的甜美&#xff0c;温柔等都可以突显 有喜欢的可以尝试一下哟…

Java课程设计团队博客 —— 基于网页的时间管理系统

博客目录 1.项目简介2.项目采用的技术3.功能需求分析4.项目亮点5.主要功能截图6.Git地址7.总结 Java团队博客分工 姓名职务负责模块个人博客孙岚组长 资源文件路径和tomcat服务器的相关配置。 前端的页面设计与逻辑实现的代码编写。 Servlet前后端数据交互的编写。 用户登录和…

数据结构实战:变位词侦测

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;逐个比较法1、编写源程序2、代码解释说明&#xff08;1&#xff09;函数逻辑解释&#xff08;2&#xff09;主程序部分 3、运行程序&#xff0c;查看结果4、计算时间复杂度 &#xff08;二&#xff09;排序比较法1…

windows server 2012、2019服务器定时重启

手动设置定时任务 1.开始菜单&#xff0c;找到“计划任务程序”; 如果无法创建基本任务的话&#xff0c;可能是系统中的“Task Scheduler”服务没有启动&#xff0c;你可在运行中键入“ services.msc”&#xff0c;查看“Task Scheduler”服务是否被设置成了“已禁用”&#x…

一个个人博客应该怎么学?

一个个人博客应该怎么学&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;复&…

哪个牌子的护眼台灯适合学生?2024护眼台灯推荐

不知道各位父母对孩子的视力健康有没有关注&#xff0c;我国儿童青少年的近视率高达52.7%&#xff0c;也就是说&#xff0c;平均是个儿童中就有五个儿童存在视力问题&#xff0c;而且近视发生年龄提前至3到7岁。作为一名眼部护理博主&#xff0c;孩子从小看书、看屏幕起&#x…

10分钟快速搭建个人博客、文档网站!

本文来分享 8 个现代化前端工具&#xff0c;帮你快速生成个人博客、文档网站&#xff01; VitePress VitePress 是一款静态站点生成器&#xff0c;专为构建快速、以内容为中心的网站而设计。简而言之&#xff0c;VitePress 获取用 Markdown 编写的源内容&#xff0c;为其应用…

爬虫实战丨基于requests爬取比特币信息并绘制价格走势图

文章目录 写在前面实验环境实验描述实验内容 写在后面 写在前面 本期内容&#xff1a;基于requests爬取比特币信息并绘制价格走势图 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88734451 实验环境 anaconda丨pycharmpython3.11.4requests 安装r…

3D scanner with DLPC3478

https://www.bilibili.com/video/BV1vJ411J7ih?p3&vd_source109fb20ee1f39e5212cd7a443a0286c5 因数&#xff1a; 分别率波长pattern速度 DMD 与 DLPC匹配 3D scanner是结构光的概念走的 Internal pattern, 是DLPC内部提供图像给DMD External Pattern, 外部FPGA /MCU…

计算n的平方根m 进而将m向下取整 math.isqrt()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算n的平方根m 进而将m向下取整 math.isqrt() 选择题 请问执行math.isqrt(10)的运行结果是&#xff1a; import math print("【执行】math.sqrt(10)") print (math.sqrt(10)) pr…

02.部署LVS-DR群集

技能展示&#xff1a; 了解LVS-DR群集的工作原理 会构建LVS-DR负载均衡群集 2.1 LVS-DR 集群 LVS-DR&#xff08; Linux Virtual Server Director Server &#xff09;工作模式&#xff0c;是生产环境中最常用的一种工作模式。 2.1.1&#xff0e;LVS-DR 工作原理 LVS-DR 模式&…

easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏

1&#xff1a;效果示例 2&#xff1a;代码示例&#xff1a; UnLockCell.java package com.example.juc.zhujie;/*** Author * Date Created in 2023/12/19 10:09* DESCRIPTION:* Version V1.0*/import java.lang.annotation.*;/*** 用于标记锁定哪些列不需要锁定* author 12…

VMware Workstation17安装教程及安装Ubuntu22.04系统

编程如画&#xff0c;我是panda&#xff01; 前言 VMware Workstation Pro 是一款高级虚拟化软件&#xff0c;使用户能够在单一计算机上同时运行多个操作系统&#xff0c;如Windows、Linux和macOS&#xff0c;而无需重新启动。具备虚拟机快照、高级网络配置、克隆和复制功能&a…

从源码分析 MySQL 身份验证插件的实现细节

最近在分析ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)这个报错的常见原因。 在分析的过程中&#xff0c;不可避免会涉及到 MySQL 身份验证的一些实现细节。 加之之前对这一块就有很多疑问&#xff0c;包括&#xff1a; 一个明文密码&…

机器学习基本算法:算法流程和算法分类

1、算法流程 机器学习的过程是一个完整的项目周期&#xff0c;其中包括数据的采集、数据的特征提取与分类&#xff0c;之后采用何种算法去创建机器学习模型从而获得预测数据。 算法流程 从上图可以看出一个完整的机器学习项目包含以下这些内容&#xff1a; 输入数据&#x…

小程序系列-5.WXML 模板语法

一、数据绑定 1、在 data 中定义页面的数据 动态绑定内容&#xff1a; 动态绑定属性&#xff1a; 2. Mustache 语法的格式 3. Mustache 语法的应用场景 4. 三元运算 5.算数运算 二、 事件绑定 1. 什么是事件&#xff1f; 2. 小程序中常用的事件 3. 事件对象的属性列表 4.…