Spring Boot 中的拦截器 Interceptors

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


前言

Spring Boot中的拦截器(Interceptor)是一种用于拦截和处理HTTP请求的机制,它基于Spring MVC框架中的HandlerInterceptor接口实现。拦截器允许在请求到达控制器(Controller)之前或之后执行一些共享的逻辑。

自定义拦截器案例

下面是一个自定义拦截器的示例,用于记录请求的开始时间和结束时间:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LogInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);return true; // 继续执行后续处理}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {long endTime = System.currentTimeMillis();long startTime = (Long) request.getAttribute("startTime");long executionTime = endTime - startTime;System.out.println("Request URL: " + request.getRequestURL());System.out.println("Execution time: " + executionTime + "ms");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 可选操作,在请求完成后执行一些清理工作}
}

接下来,我们需要将这个拦截器注册到Spring MVC的拦截器链中。可以通过实现WebMvcConfigurer接口并重写addInterceptors方法来实现:

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 WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogInterceptor()).addPathPatterns("/api/**") // 指定拦截路径模式.excludePathPatterns("/api/login"); // 排除登录路径}
}

在上面的代码中,我们创建了一个名为LogInterceptor的拦截器类,并在WebConfig类中将其注册到拦截器链中。通过addPathPatterns方法指定了需要拦截的URL路径模式,而excludePathPatterns方法则排除了不需要拦截的路径。在这个例子中,我们将拦截所有以"/api/"开头的请求,但排除了"/api/login"路径。

当有请求匹配到指定的路径模式时,LogInterceptor中的preHandle方法会在请求到达控制器之前被调用,postHandle方法会在请求处理完成后被调用。在这些方法中,我们可以添加自定义的逻辑来记录请求的开始时间和结束时间,并计算请求的处理时间。

注册拦截器案例

 下面是一个注册拦截器的示例,用于检查用户是否已登录:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 检查用户是否已登录if (request.getSession().getAttribute("user") == null) {// 如果用户未登录,重定向到登录页面response.sendRedirect("/login");return false; // 阻止请求继续执行后续处理}return true; // 继续执行后续处理}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 可选操作,在请求完成后执行一些清理工作}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 可选操作,在请求完成后执行一些清理工作}
}

接下来,我们需要将这个拦截器注册到Spring MVC的拦截器链中。可以通过实现WebMvcConfigurer接口并重写addInterceptors方法来实现:

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 WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/api/**") // 指定拦截路径模式.excludePathPatterns("/api/login", "/api/register"); // 排除登录和注册路径}
}

在上面的代码中,我们创建了一个名为LoginInterceptor的拦截器类,并在WebConfig类中将其注册到拦截器链中。通过addPathPatterns方法指定了需要拦截的URL路径模式,而excludePathPatterns方法则排除了不需要拦截的路径。在这个例子中,我们将拦截所有以"/api/"开头的请求,但排除了"/api/login"和"/api/register"路径。

当有请求匹配到指定的路径模式时,LoginInterceptor中的preHandle方法会在请求到达控制器之前被调用。在这个方法中,我们检查用户的登录状态,如果用户未登录,则重定向到登录页面并阻止请求继续执行后续处理。如果用户已登录,则允许请求继续执行后续处理。

总结

总结来说,Spring Boot中的拦截器是一种强大的工具,可以在请求处理的不同阶段执行自定义逻辑。通过实现HandlerInterceptor接口并注册到拦截器链中,可以轻松地添加日志记录、权限检查、性能监控等功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACL(Access Control List)访问控制列表

目录 ACL 访问控制列表 ACL分类 ACL的组成 ACL匹配机制 ACL调用方式 实验配置 不允许PC1访问PC4 只允许PC1访问PC4 高级ACL 基本概念 实验配置 限制ping 实验配置 限制DNS 基于时间的ACL 实验配置 ACL 访问控制列表 根据一系列不同的规则,设备根据这…

基础篇:667的大题题型与应对策略

通过本节,你将学习到: 667分析题的考查方向与基本题型667分析题的两种解决策略 667分析题的三大基本题型 首先,通过回顾667科目分析题的真题(2021-2024年),我根据题目特点将其归纳为三个主要类别。这样的…

Python:import语句的使用(详细解析)(一)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 import语句是Python中一个很重要的机制,允许在一个文件中访问另一个文件的函数、类、变量等,本文就将进行详细介绍。 在具体谈论import语句前&a…

使用ESPnet的 setup_anaconda.sh安装脚本一步到位,配置conda虚拟环境

使用ESPnet的 setup_anaconda.sh 安装脚本一步到位,配置conda虚拟环境 前言 ESPnet(End-to-End Speech Processing Toolkit)是一款用于语音识别、语音合成等任务的开源端到端语音处理工具包。为了在不同系统上快速配置ESPnet开发环境&#…

Linux复习--Linux服务管理类(SSH服务、DHCP+FTP、DNS服务、Apache服务、Nginx服务、HTTP状态码)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、SSH服务 1、问题引出 哪些设置能够提升SSH远程管理的安全等级? 2、SSH的登录验证方式-口令登录 3、SSH的登录验证方式-密钥登录 4、…

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统:windows11java版本:23android sdk版本:35android ndk版本:22rust版本: AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk,…

Python编写的贪吃蛇小游戏

安装包 pip install pygame完整代码 import pygame import randompygame.init()# 定义颜色 white (255, 255, 255) black (0, 0, 0) red (213, 50, 80) green (0, 255, 0) blue (50, 153, 213)# 定义屏幕大小 dis_width 800 dis_height 600dis pygame.display.set_mo…

探索TOGAF理论的实践应用:企业数字化转型的深度指南

数字化转型的迫切性与路径选择 随着全球化进程和技术革命的加速,企业正面临前所未有的挑战和机遇。数字化转型已成为企业保持竞争力、创新业务模式、优化客户体验的核心手段。然而,企业在实施数字化转型时,往往面临路径不清、技术与业务脱节…

win系统网络重置

重置网络命令:netsh winsock reset 输入winR 调用运行窗口,回车 输入重置网络命令:netsh winsock reset 注意空格

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单,但也有一些插件安装会比较难。比如我在安装SadTalker时,就遇到很多问题,一度放弃了,后来查了一些网上攻略,自己也反复查看日志,终于解决,不吐不快。 一、在Stable …

15分钟学 Python :编程工具 Idea 和 vscode 中配置 Python ( 补充 )

编程工具配置 Python 在 IDE 和 VSCode 中 在编程学习的过程中,选择合适的开发工具至关重要。本文将详细介绍在两种流行的IDE(IntelliJ IDEA 和 Visual Studio Code)中如何配置Python环境,帮助你更高效地进行Python开发。 一、编…

基于SSM的出租车租赁管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1 选题的背景 现代社会,许多个人、家庭,因为生活、工作方式的改变,对汽车不再希望长期拥有,取而代之的是希望汽车能“召之即…

开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践指南)

DotNet Exercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库、工作业务实操练习集,配套详细的文章教程讲解,助你快速掌握C#/.NET/.NET Core中各种编程常用语法、算法、技巧、中间件、类库、工作业务实操等等。 GitH…

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中,我们开启了Spring Boot的入门之旅,成功构建了第一个Spring Boot应用。我们从环境搭建开始,详细介绍了JDK的安装以及IDE的选择与配置,然后利用Spring Initializr创建了项目,分析了项目结构&am…

黑马linux笔记(转载)

学习链接 视频链接:黑马程序员新版Linux零基础快速入门到精通 原文链接:黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…

SSM人才信息招聘系统-计算机毕业设计源码28084

摘要 本研究旨在基于Java和SSM框架设计并实现一个人才信息招聘系统,旨在提升招聘流程的效率和精准度。通过深入研究Java和SSM框架在Web应用开发中的应用,结合人才招聘领域的需求,构建了一个功能完善、稳定高效的招聘系统。利用SSM框架的优势&…

数据订阅与消费中间件Canal 服务搭建(docker)

MySQL Bin-log开启 进入mysql容器 docker exec -it mysql5.7 bash开启mysql的binlog cd /etc/mysql/mysql.conf.dvi mysqld.cnf #在文件末尾处添加如下配置(如果没有这个文件就创建一个) [mysqld] # 开启 binlog log-binmysql-bin #log-bin/var/lib/mys…

CSP-J模拟赛三补题报告

前言 挂了110pts( ⇑ \Uparrow ⇑ \hspace{14em} 有史以来最大傻逼 T1: 100 p t s \color{green}100pts 100pts T2: 100 p t s → 80 p t s \color{green}100pts\color{yellow}\rightarrow\color{red}80pts 100pts→80pts T3: 100 p t s → 10 p t s \color{gre…

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理

clusterIP作为k8s中的服务, 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod,pod由控制器自动部署,自动维护 那么问题是service的可用…

【C++前缀和】1895. 最大的幻方|1781

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1895. 最大的幻方 难度分:1781 一个 k x k 的 幻方 指的是一个 k x k 填满整数的方格阵,且每一行、每一列以及两条对角线的和 全部相…