SpringBoot中HandlerInterceptor拦截器的构建详细教程

  1. 作用范围:拦截器主要作用于Spring MVC的DispatcherServlet处理流程中,针对进入Controller层的请求进行拦截处理。它基于Java的反射机制,通过AOP(面向切面编程)的思想实现,因此它能够访问Spring容器中的Bean,利用Spring的强大功能,如依赖注入、事务管理等。
  2. 实现方式:拦截器需要实现Spring的HandlerInterceptor接口或继承HandlerInterceptorAdapter类,并通过配置在Spring MVC的配置类中注册。
  3. 执行时机:拦截器的执行时机在Controller方法调用前后,以及视图渲染完成后,可以用来处理权限校验、日志记录、请求参数修改等。
  4. 依赖性:拦截器不依赖于Servlet容器,而是依赖于Spring框架。

拦截器通常用于处理业务逻辑相关的拦截,如权限检查、日志记录、事务管理等,更适合需要访问Spring容器中Bean的场景。

目录

拦截器实现案例:

1、创建一个名为UserInterceptor的类

2、进行拦截器配置:需要一个配置类

3、创建一个Controller类

4、启动主类


拦截器实现案例:

创建springboot项目,最终项目结构如下:

pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.softeem</groupId><artifactId>springboot</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.softeem.springboot.SpringbootApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

1、创建一个名为UserInterceptor的类

实现Spring MVC框架中的HandlerInterceptor接口。这个接口是用来定义请求处理过程中的拦截器,可以在请求被处理之前、之后以及完成后执行一些自定义的操作。

public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("进入拦截器---------------------------");//编写业务拦截的规则User user = (User) request.getSession().getAttribute("user");if (user == null){response.sendRedirect(request.getContextPath() + "/user/error");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 {}
}

2、进行拦截器配置:需要一个配置类

设置拦截器(Interceptor)以实现特定的请求处理逻辑。

@Configuration  //定义此类为配置文件(即相当于之前的xml配置文件)
public class InterceptorConfig implements WebMvcConfigurer {//mvc:interceptors@Overridepublic void addInterceptors(InterceptorRegistry registry) {//要拦截user下的所有访问请求,必须用户登录后才可访问,// 但是这样拦截的路径中有一些是不需要用户登录也可访问的String[] addPathPatterns = {"/user/**"};//要排除的路径,排除的路径说明不需要用户登录也可访问String[] excludePathPatterns = {"/user/out", "/user/error","/user/login"};//mvc:interceptor bean class=""registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);}
}

详解:

类定义与注解

  • @Configuration:这是一个Spring框架的注解,用于指示当前类是一个配置类,相当于传统的XML配置文件。Spring会自动扫描并读取此类中的Bean定义和配置信息。
  • implements WebMvcConfigurer:表明InterceptorConfig类实现了WebMvcConfigurer接口。这个接口提供了自定义Spring MVC配置的方法,允许你在不继承WebMvcConfigurerAdapter或重写WebMvcConfigurationSupport的情况下扩展Spring MVC的功能。

方法重写:addInterceptors

  • addInterceptors方法是WebMvcConfigurer接口提供的,用于注册自定义的拦截器到Spring MVC中。当应用程序接收到HTTP请求时,这些拦截器会在请求到达具体控制器方法之前或之后执行预处理或后处理逻辑。

拦截规则定义

  • String[] addPathPatterns = { "/user/**" };:这部分定义了哪些URL路径需要被拦截器处理。/user/**是一个通配符模式,表示所有以/user/开头的URL都会被此拦截器拦截。
  • String[] excludePathPatterns = { ... }:这部分定义了需要从拦截规则中排除的路径。例如,/user/out, /user/error, /user/login等路径被排除,意味着这些URL请求不会经过拦截器,可以直接访问。这对于无需用户身份验证就能访问的页面(如登录页面)特别有用。

注册拦截器

  • registry.addInterceptor(...):通过InterceptorRegistry实例注册一个拦截器。这里使用的是new UserInterceptor(),意味着注册了一个名为UserInterceptor的拦截器实例。
  • .addPathPatterns(...) 和 .excludePathPatterns(...) 分别用来添加需要拦截的路径模式和需要排除的路径模式,前面定义的数组在这里被用作参数。

3、创建一个Controller类

@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public String login(){return "login success";}@RequestMapping("/center")public String center() {return "我被拦截了...不能显示";}@RequestMapping("/out")public String out(HttpSession session) {session.invalidate();return "我被排除拦截...可以显示 user/out";}//如果用户未登录访问了需要登录才可访问的请求,之后会跳转至该请求路径//该请求路径不需要用户登录也可访问@RequestMapping("/error")public String error() {return "被拦截:error";}
}

4、启动主类

上述配置类中将"/user/out", "/user/error","/user/login"排除掉了

首先尝试访问/user/out

访问user/center

被拦截且跳转user/error

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

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

相关文章

【Fastadmin】后台角色组权限问题(multi,开关switch,控制器新增方法)

1.列表开关类型的权限 如图&#xff1a; 此类开关请求的方法为multi 开关在点击的时候默认是只允许修改数据库的status字段的&#xff0c;如果我们开关不是status字段&#xff0c;我们需要在服务端对应的控制器中定义protected $multiFields"id,name,swith";&#x…

️测试问我:为啥阅读量计数这么简单的功能你都能写出bug?

前言 可乐他们团队最近在做一个文章社区平台,由于人手不够,后端部分也是由前端同学来实现,使用的是 nest 。 今天他接到了一个需求,就是在用户点开文章详情的时候,把阅读量 +1 ,这里不需要判断用户是否阅读过,无脑 +1 就行。 它心想:这么简单,这不是跟 1+1 一样么。…

1-2 ARM单片机GPIO

def&#xff1a;通用输入输出口 GPIO输出模式原理讲解 1&#xff1a;推挽输出 2&#xff1a;复用推挽输出 电流最大是20mA&#xff0c;对于单片机来说总体的输出是由范围的 开漏/复用开漏输出 外部接上拉电阻的开漏输出 线与的概念 注&#xff1a; 与的概念&#xff1a;全1为1&…

3d模型实体显示有隐藏黑线?---模大狮模型网

在3D建模和设计领域&#xff0c;细节决定成败。然而&#xff0c;在处理3D模型时&#xff0c;可能会遇到模型实体上出现隐藏黑线的问题。这些黑线可能影响模型的视觉质量和呈现效果。因此&#xff0c;了解并解决这些隐藏黑线的问题至关重要。本文将探讨隐藏黑线出现的原因&#…

Java基础教程 - 4 流程控制

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 4 流程控制 4.1 分支结构…

16、ESP32 Web

Web 服务器具有移动响应能力&#xff0c;可以使用本地网络上的任何设备作为浏览器进行访问。 示例功能&#xff1a; 构建 Web 服务器控制连接到 ESP32 的 LED在本地网络的浏览器上输入 ESP32 IP 地址访问 Web 服务器通过单击 Web 服务器上的按钮&#xff0c;更改 LED 状态 //…

YOLO系列笔记(十一)——csv文件转换成xml文件

csv文件转换成xml文件 前言意义代码解析导入模块转义特殊XML字符定义主函数功能解析 执行函数 结语 前言 在深入研究YOLO等图像处理神经网络之后&#xff0c;我深刻认识到数据是深度学习的基石。事实上&#xff0c;无论是何种类型的神经网络&#xff0c;它们都极度依赖于数据的…

池化技术介绍

一、数据库连接池 MySQL数据库连接过程分为两个部分 第一部分是前三个数据包。第一个数据包是客户端向服务端发送的一个“SYN”包&#xff0c;第二个包是服务端回给客户端的“ACK”包以及一个“SYN”包&#xff0c;第三个包是客户端回给服务端的“ACK”包&#xff0c;熟悉TCP协…

VS Code中PlatformIO IDE的安装并开发Arduino

VS Code中PlatformIO IDE的安装并开发Arduino VS Code的安装 略 PlatformIO IDE的安装 PlatformIO IDE是是什么 PlatformIO IDE 是一个基于开源的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于嵌入式系统和物联网&#xff08;IoT&#xff09;开发。…

CANdela/Diva系列1--CANdela Studio的基本介绍

大家好&#xff0c;这个系列主要给大家介绍跟诊断相关的Vector 工具CANdela和Diva&#xff0c;首先介绍CANdela。 目录 1.CANdela的简介&#xff1a; 2.如何打开CANdela 工程&#xff1a; 3.CANdela工程的详细介绍&#xff1a; 3.1 工具栏的介绍&#xff1a; 3.2 工作树的…

全新拼团模式 你一定没见过 白拿产品还有收益!

在七星拼团模式中&#xff0c;奖励制度是其核心吸引力之一。今天&#xff0c;我们将深入探讨这一模式的三种奖励&#xff1a;直推奖、滑落奖和出局奖&#xff0c;以及它们背后的互助机制。 奖励规则概述 首先&#xff0c;让我们了解一下奖励的具体规则。假设商品售价为499元&a…

自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录 一、inventory 主机清单 1.1inventory 中的变量 1.1.1主机变量 1.1.2组变量 1.1.3组嵌套 二、Ansible 的脚本 ------ playbook&#xff08;剧本&#xff09; 2.1 playbook介绍 2.2playbook格式 2.3playbooks 的组成 2.4playbook编写 2.5运行playbook 2.5.1ans…

SpringBoot使用阿里云实现短信功能

引入依赖 <!-- 阿里云依赖 --> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.3</version> </dependency> <dependency><groupId>com.aliyun<…

JavaScript中的扩展操作符作用是什么,有什么含义?

在 JavaScript 中&#xff0c;扩展操作符允许一个表达式在某些地方展开成多个元素。这个特性在 ES2015 (也叫做 ES6) 中被引入到 JavaScript 语言中&#xff0c;并广泛用于数组和对象。在您的代码示例中&#xff0c;它被用于对象。 对象中的扩展操作符 在对象字面量中使用扩展…

SolidWorks进行热力学有限元分析二、模型装配

1.先打开软件&#xff0c;新建装配体 2.选中你要装配的零件&#xff0c;直接导入就行 3.鼠标点击左键直接先放进去 4.开始装配&#xff0c;点配合 5.选择你要接触的两个面&#xff0c;鼠标右键确定&#xff0c;然后把剩下的面对齐一下就行了 6.搞定

代码随想录day60 | 动态规划P17 | ● 647. ● 516.● 动态规划总结篇

今天 结束动态规划章节 正好是60天 fighting 647. 回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的…

Terraform输出值

如果把Terraform代码看作是一个函数的话&#xff0c;那么“输入变量”是函数的参数&#xff0c;而“局部值”是函数内部的局部变量&#xff0c;“输出值”就是函数的返回值。 在Terraform代码中可以定义多个输出值。 在执行terraform apply命令成功之后会打印出定义的输出值信息…

Day1| Java基础 | 1 面向对象特性

Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么&#xff1f;多态特性你是怎…

嵌入式学习

笔记 作业 将一张bmp图片修改成德国国旗。 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #in…

基于vue.js+thymeleaf模板引擎+ajax的注册登陆简洁模板(含从零到一详细介绍)

文章目录 前言1、数据库准备2、工具类与相关基类使用2.1、工具类2.2、相关基类 3、web包目录说明4、注册功能设计&#xff08;本文核心部分&#xff09;4.1、注册页面设计4.2、注册逻辑设计 5、登陆功能设计5.1、登陆页面设计5.2、登陆逻辑设计 6、运行效果图 前言 大多数的网…