当前位置: 首页 > news >正文

【SpringBoot】27 拦截器

Gitee仓库

https://gitee.com/Lin_DH/system

介绍

拦截器:拦截器是 Spring 框架提供的核心功能之一,主要用来拦截用户请求,在指定方法前后,根据业务需要执行预先设定的代码。
拦截器允许开发人员提前预定义一些逻辑,在用户请求、响应前后执行。也可以在用户请求前阻止其执行。
在拦截器中,开发人员可以在应用程序中做一些通用性的操作,比如通过拦截器来拦截前端发送的请求,判断 Session 中是否有登录用户的信息,如果有则放行,没有则进行拦截。
在这里插入图片描述

使用步骤

1)定义拦截器
实现 HandlerInterceptor 接⼝,并重写其所有方法。

  • preHandle 方法:请求处理之前执行。返回 true,继续执行后续操作;返回 false,中断后续操作。
  • postHandle 方法:请求处理之后,且视图处渲染之前执行。
  • afterCompletion 方法:整个请求结束之后,视图渲染完毕后执行,最后执行。

2)注册配置拦截器
实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法。

拦截器执行流程

在这里插入图片描述

代码实现

第一步:实现 HandlerInterceptor 接口,重写其所有方法。

LoginInterceptor.java

package com.lm.system.interceptor;import lombok.extern.slf4j.Slf4j;
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;/*** @author DUHAOLIN* @date 2024/11/12*/
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("校验用户登录信息");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("返回用户信息");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("视图渲染完毕后执⾏,最后执行");}}

第二步:实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法。

WebConfig.java

package com.lm.system.config;import com.lm.system.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;/*** @author DUHAOLIN* @date 2024/11/12*/
@Configuration
public class WebConfig implements WebMvcConfigurer {//自定义拦截器对象@Resourceprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册自定义拦截器对象registry.addInterceptor(loginInterceptor)//排除某些路径//.excludePathPatterns("/login", "/error")//设置拦截器拦截的请求路径(/** 表示拦截所有请求).addPathPatterns("/**");}
}

效果图

访问 Controller,发送请求。

控制台输出日志

2024-11-12 16:46:43  INFO 7740  org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-11-12 16:46:43  INFO 7740  org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:525) : Initializing Servlet 'dispatcherServlet'
2024-11-12 16:46:43  INFO 7740  org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:547) : Completed initialization in 2 ms
2024-11-12 16:46:43  INFO 7740  com.lm.system.interceptor.LoginInterceptor.preHandle(LoginInterceptor.java:21) : 校验用户登录信息Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1a68bd5d] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1883892764 wrapping com.mysql.cj.jdbc.ConnectionImpl@1d1b0673] will not be managed by Spring
==>  Preparing: SELECT id, `name`, age, gender, deleted, create_time, update_time FROM t_user WHERE deleted = 0
==> Parameters: 
<==    Columns: id, name, age, gender, deleted, create_time, update_time
<==        Row: 1, Tom, 18,, 0, 2024-08-21 16:47:45, 2024-08-21 16:47:45
<==        Row: 2, Joe, 20,, 0, 2024-08-21 16:47:58, 2024-08-21 16:47:58
<==        Row: 3, Jim, 33,, 0, 2024-08-21 16:48:12, 2024-08-21 16:48:12
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1a68bd5d]
2024-11-12 16:46:43  INFO 7740  com.lm.system.common.ResultBody.getReturn(ResultBody.java:102) : {"status": 200,"msg": null,"count": 3,"data": [{"id": 1,"name": "Tom","age": 18,"gender": "男","create_time": "2024-08-21 16:47:45","update_time": "2024-08-21 16:47:45"},{"id": 2,"name": "Joe","age": 20,"gender": "女","create_time": "2024-08-21 16:47:58","update_time": "2024-08-21 16:47:58"},{"id": 3,"name": "Jim","age": 33,"gender": "女","create_time": "2024-08-21 16:48:12","update_time": "2024-08-21 16:48:12"}]
}2024-11-12 16:46:43  INFO 7740  com.lm.system.interceptor.LoginInterceptor.postHandle(LoginInterceptor.java:27) : 返回用户信息2024-11-12 16:46:43  INFO 7740  com.lm.system.interceptor.LoginInterceptor.afterCompletion(LoginInterceptor.java:32) : 视图渲染完毕后执⾏,最后执行

项目结构图

在这里插入图片描述

参考链接

Spring Boot实战:拦截器【https://blog.csdn.net/LHY537200/article/details/140947681】

相关文章:

【SpringBoot】27 拦截器

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 拦截器&#xff1a;拦截器是 Spring 框架提供的核心功能之一&#xff0c;主要用来拦截用户请求&#xff0c;在指定方法前后&#xff0c;根据业务需要执行预先设定的代码。 拦截器允许开发人员提前预定义一些逻辑&#xff0c…...

AI对开发者的影响,以及传统软件开发 与 AI参与的软件开发区别

AI 大模型&#xff0c;尤其是像 GPT-4、BERT 这样的语言模型&#xff0c;正以深远的影响改变着软件开发流程。传统的软件开发流程通常依赖开发人员进行代码编写、测试、调试等工作&#xff0c;但随着 AI 技术的进步&#xff0c;AI 可以承担越来越多的任务&#xff0c;自动化和优…...

HBase Java基础操作

Apache HBase 是一个开源的、分布式的、可扩展的大数据存储系统&#xff0c;它基于 Google 的 Bigtable 模型。使用 Java 操作 HBase 通常需要借助 HBase 提供的 Java API。以下是一个基本的示例&#xff0c;展示了如何在 Java 中连接到 HBase 并执行一些基本的操作&#xff0c…...

关于一次开源java spring快速开发平台项目RuoYi部署的记录

关于一次开源java spring快速开发平台项目RuoYi部署的记录 本次因为需要一些练习环境&#xff0c;想要快速搭建一个javaweb 项目作为练习环境&#xff0c;经过查询和实验找到一个文档详细&#xff0c;搭建简单&#xff0c;架构也相对比较新的开源项目RuoYi。 项目介绍&#xf…...

【AI编程实战】安装Cursor并3分钟实现Chrome插件(保姆级)

Cursor介绍 https://www.cursor.com/ 一句话介绍&#xff1a;AI代码编辑器&#xff0c;当前最火的AI编程器 软件下载与安装 下载 打开Cursor官网下载&#xff0c;会根据操作系统的差别进行选择 https://www.cursor.com/ 这里下载的内容很小&#xff0c;是个安装器&#x…...

【Chatgpt】如何通过分层Prompt生成更加细致的图文内容

如何通过分层Prompt生成更加细致的图文内容 利用ChatGPT和类似的生成式AI模型&#xff0c;通过分层Prompt设计可以生成更具层次感和细节的图文内容。分层Prompt的核心在于将需求分解成多层次的指令&#xff0c;从宏观到微观逐步细化&#xff0c;最终形成高质量的内容输出。 一…...

中间件--laravel进阶篇

laravel版本11.31,这中间件只有3种,分别是全局中间件,路由中间件,控制器中间件。相比thinkphp8,少了一个应用中间件。 一、创建中间件 laravel创建中间件可以使用命令的方式创建,非常方便。比如php artisan make:middleware EnsureTokenIsValid。EnsureTokenIsValid是中间…...

【vue】vue中.sync修饰符如何使用--详细代码对比

.sync修饰符作用 .sync修饰符是一个语法糖&#xff0c;可以简化父子组件通信操作&#xff0c;当子组件想改变父组件数值时&#xff0c;父组件只需要使用.sync修饰符&#xff0c;子组件使用props接收属性&#xff0c;再使用this.$emit(update:属性, 值);就可以实现子组件更新父…...

repmgr安装及常用运维指令

简介 repmgr 由 EDB 与其他个人和组织的贡献一起开发&#xff0c;安装部署相对较为简单 安装 repmgr官网上传对应的安装到服务器上 安装前/etc/hosts IP映射、始终同步、免密通信本文忽略 repmgr的安装相对较为简单,目前repmgr-5仅仅支持到postgresql-15 postgresql必要参数…...

RedHat系统配置静态IP

1、执行nmtui命令进入字符配置界面如下图所示 2、选择编辑连接进入 3、选择编辑进入后&#xff0c;将IPv4设置为手动模式后&#xff0c;选择显示后进行ip地址、网关、DNS的配置&#xff0c;配置完成后选择确定退出编辑 4、进入主界面后选择启用连接进入后&#xff0c;选择启用&…...

nvm和nrm的安装与使用

NVM相关请跳转&#xff1a; Node版本管理器nvm的安装与使用 nrm 的安装与使用 nrm&#xff08;NPM Registry Manager&#xff09;是一个用于管理和切换 NPM 源的工具。它允许你在多个 NPM 源之间快速切换&#xff0c;以提高包管理的速度和效率。以下是 nrm 的安装和使用方法&…...

10大核心应用场景,解锁AI检测系统的智能安全之道

随着工业化和自动化的快速推进&#xff0c;高风险作业场景的安全管理需求日益增加。思通数科AI检测系统以深度学习、计算机视觉和多模态数据融合技术为基础&#xff0c;通过智能化监控和实时反馈&#xff0c;为企业提供全面的作业安全和流程管理解决方案。本文将详细解读该系统…...

香豆烤馍:传统美食中的烟火记忆

食家巷香豆烤馍&#xff0c;承载着甘肃人的乡愁与记忆。它那朴实的外表下&#xff0c;蕴含着丰富的口感和深厚的文化底蕴。烤馍的制作过程充满了烟火气息。选用优质的面粉&#xff0c;经过发酵、揉制等多道工序&#xff0c;再放入传统的烤炉中慢慢烘烤。这个过程需要经验丰富的…...

金融量化交易模型的探索与发展

随着全球金融市场的不断变化与技术进步&#xff0c;量化交易逐渐成为机构和个人投资者的重要选择。作为数据驱动的交易方式&#xff0c;量化交易通过科学建模和技术手段&#xff0c;有效提升了交易效率与决策精准度。本文将探讨金融量化交易模型的创新探索与未来发展方向。 量化…...

灾难恢复计划 (DRP)

灾难恢复计划 (DRP)   目录 灾难恢复计划 (DRP) 1 1. 简介 2 2. 目的 2 3. 范围 3 4. 风险评估 3 5. 容灾方案 3 6. 关键系统恢复优先级 4 7. 恢复流程 4 8. 测试与维护 5 9. 联系信息 5 10. 批准与分发 5 11. 附录 5 1. 简介 灾难恢复计…...

Makefile 之 wordlist

wordlist $(wordlist <s>,<e>,<text> ) 名称&#xff1a;取单词串函数——wordlist。 功能&#xff1a;从字符串<text>中取从<s>开始到<e>的单词串。<s>和<e>是一个数字。 返回&#xff1a;返回字符串<text>中从…...

半导体工艺与制造篇1 绪论

我们为什么要研究半导体&#xff1f;半导体凭什么可以成为电子信息行业的基础呢&#xff1f; 这就要说到半导体的一个重要特点&#xff1a;可以通过控制掺杂率来控制它的导电性 集成电路IC的生产 集成电路IC的生产包括&#xff1a; #mermaid-svg-rWB59zU4pI2cGloo {font-fami…...

接雨水

接雨水 1、 题目描述2、解题思路 1、 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 2、解题思路 本题使用了双指针&#xff0c;根据下图可以得出&#xff0c;下标 i 处能接的雨水量由左边…...

Python蓝桥杯刷题1

1.确定字符串是否包含唯一字符 题解&#xff1a;调用count函数计算每一个字符出现的次数&#xff0c;如果不等于1就输出no&#xff0c;并且结束循环&#xff0c;如果等于1就一直循环直到计算到最后一个字符&#xff0c;若最后一个字符也满足条件&#xff0c;则输出yes import…...

实习冲刺第二十七天

3.无重复字符的最长字串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbb…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...