【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

news2024/11/24 12:32:34

在这里插入图片描述

💓 博客主页:从零开始的-CodeNinja之路

⏩ 收录文章:【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

🎉欢迎大家点赞👍评论📝收藏⭐文章
在这里插入图片描述

在这里插入图片描述

目录

  • SpringBoot统⼀功能处理
    • 一. 什么是拦截器?
    • 二. 拦截器执行流程
    • 三. 拦截器
        • 3.1 定义拦截器
        • 3.2 注册配置拦截器
        • 3.3 拦截路径的配置

SpringBoot统⼀功能处理

一. 什么是拦截器?

  • 需要修改每个接口的处理逻辑
  • 需要修改每个接口的返回结果
  • 接口定义修改,前端代码也需要跟着修改

有没有更简单的办法,统⼀拦截所有的请求,并进行Session校验呢,这里我们学习⼀种新的解决办法:拦
截器

拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执
行预先设定的代码.也就是说,允许开发⼈员提前预定义⼀些逻辑,在用户的请求响应前后执行.也可以在用户请求前阻止其执行.

在拦截器当中,开发⼈员可以在应用程序中做⼀些通用性的操作,比如通过拦截器来拦截前端发来的
请求,判断Session中是否有登录用户的信息.如果有就可以放行,如果没有就进行拦截.
在这里插入图片描述

二. 拦截器执行流程

正常的调用顺序:在这里插入图片描述
有了拦截器之后,会在调用Controller之前进行相应的业务处理,执行的流程如下图在这里插入图片描述

  1. 添加拦截器后,执行Controller的方法之前,请求会先被拦截器拦截住.执行 preHandle() 方法,
    这个方法需要返回⼀个布尔类型的值.如果返回true,就表示放行本次操作,继续访问controller中的
    方法.如果返回false,则不会放行(controller中的方法也不会执行).

  2. controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及
    afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据.

三. 拦截器

拦截器的基本使用.

拦截器的使用步骤分为两步:

  1. 定义拦截器
  2. 注册配置拦截器
  3. 拦截器的拦截路径配置
3.1 定义拦截器

自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {

	@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler) throws Exception {
	log.info("LoginInterceptor 目标方法执行前执行..");
	return true;
	}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler, ModelAndView modelAndView) throws Exception {
	log.info("LoginInterceptor 目标方法执行后执行");
	}

@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception {
	log.info("LoginInterceptor 视图渲染完毕后执行,最后执行");
	}
}
  • preHandle()方法:目标方法执行前执行.返回true:继续执行后续操作;返回false:中断后续操作.

  • postHandle()方法:目标方法执行后执行

  • afterCompletion()方法:视图渲染完毕后执行,最后执行(后端开发现在⼏乎不涉及视图,暂不了 解)

3.2 注册配置拦截器

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

@Configuration
public class WebConfig implements WebMvcConfigurer {

//⾃定义的拦截器对象
@Autowired
private LoginInterceptor loginInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
	//注册⾃定义拦截器对象
	registry.addInterceptor(loginInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
	}
}

启动服务,试试访问任意请求,观察后端日志
在这里插入图片描述
可以看到preHandle方法执行之后就放行了,开始执行目标方法,目标方法执行完成之后执行
postHandle和afterCompletion方法.

我们把拦截器中preHandle方法的返回值改为false,再观察运行结果
在这里插入图片描述
可以看到,拦截器拦截了请求,没有进行响应.

3.3 拦截路径的配置

拦截路径是指我们定义的这个拦截器,对哪些请求生效.

我们在注册配置拦截器的时候,通过 addPathPatterns() 方法指定要拦截哪些请求.也可以通过excludePathPatterns() 指定不拦截哪些请求.

上述代码中,我们配置的是 /** ,表示拦截所有的请求.
比如用户登录校验,我们希望可以对除了登录之外所有的路径生效

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 WebConfig implements WebMvcConfigurer {
	//⾃定义的拦截器对象
	@Autowired
	private LoginInterceptor loginInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
	//注册⾃定义拦截器对象
	registry.addInterceptor(loginInterceptor)
		.addPathPatterns("/**")
		.excludePathPatterns("/user/login");//设置拦截器拦截的请求路径
	(/** 表示拦截所有请求)
	}
}

在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常见拦截路径设置:

拦截路径含义举例
/*⼀级路径能匹配/user,/book,/login,不能匹配/user/login
/**任意级路径能匹配/user,/user/login,/user/reg
/book/*/book下的⼀级路径能匹配/book/addBook,不能匹配/book/addBook/1,/book
/book/**/book下的任意级路径能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login

以上拦截规则可以拦截此项目中的使用URL,包括静态文件(图片文件,JS和CSS等文件).

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

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

相关文章

机器学习中表格数据预处理

目录 缺失值处理 在dataframe中进行填补 使用模型填补缺失值(随机森林) 异常值 数据无量纲化 中心化 数据归一化 数据标准化 缩放处理 转换数据类型 文本—>数值preprocessing.LabelEncoder:标签专用,能够将分类转换为…

计算机毕业设计 | SpringBoot健身房管理系统(附源码)

1,项目背景 随着人们生活水平的提高和健康意识的增强,健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求,需要一种更加高效、智能、安全的管理系…

【Vue探索之旅】初识Vue

文章目录 前言 渐进式框架​ 入门案例 完结撒花 前言 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手&#x…

深入了解 MyBatis 插件:定制化你的持久层框架

序言 MyBatis 是一个流行的 Java 持久层框架,它提供了简单而强大的数据库访问功能。然而,有时候我们需要在 MyBatis 中添加一些自定义的功能或行为,来满足特定的需求。这时,MyBatis 插件就发挥了重要作用。本文将深入探讨 MyBati…

Cweek1

C语言学习 一.初识C语言 1.如何写C代码 ①创建工程 ②添加源文件&#xff1a;c文件&#xff1a;源文件&#xff0c;h文件&#xff1a;头文件 代码实例&#xff1a; main函数是程序的入口&#xff0c;有且仅有一个 在C语言中&#xff0c;#include <stdio.h> 是一个预…

Linux进程(一) -- 介绍进程

计算机的系统架构 用户部分 这是用户直接与计算机交互的部分&#xff0c;包括以下三种操作&#xff1a; 指令操作&#xff1a;用户通过命令行界面&#xff08;CLI&#xff09;输入指令来操作计算机。开发操作&#xff1a;开发人员编写和调试程序代码&#xff0c;与计算机系统…

4.分支与循环

逻辑控制分为三部分&#xff1a; 1.顺序结构---》顺序执行代码 2.分支结构---》if语句和switch语句 3.循环执行---》for语句 while语句 和do while语句 顺序结构比较简单&#xff0c;按照代码书写的顺序一行一行执行 分支结构&#xff08;if、switch语句&#xff09; 也就是…

网络安全快速入门(十二) linux的目录结构

我们前面已经了解了基础命令&#xff0c;今天我们来讲讲linux中的目录结构&#xff0c;我们在了解linux的目录结构之前&#xff0c;我们先与Windows做一个对比 12.1linux和windows的目录结构对比 在之前认识liunx的章节中&#xff0c;我们已经简单说明了linux和window的目录结构…

2024年蓝桥杯——复盘

1、握手问题 知识点&#xff1a;模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手&#xff0c;仅需要两两握手&#xff0c;也就是从42个握手开始&#xff0c;而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结&#xff1a…

LLVM中期报告

1&#xff0e;主要开展的工作 研究对LLVM IR层面进行代码混淆&#xff0c;分析IR的指令 &#xff0c;并且实现混淆 从LLVM代码混淆的角度出发&#xff0c;函数之间的正常调用构成了待混淆程序的原始控制流&#xff0c;不同的基础代码块构成了一个个的函数&#xff0c;每个基础…

Edge浏览器自动翻译功能按钮不见了

前言&#xff1a; 平时偶尔会用到Edge的页面翻译功能&#xff0c;使用挺方便。突然发现Edge浏览器的翻译功能不见 了。如下图所示&#xff1a; 解决思路&#xff1a; 1、从网上找各种解决方案也没有解决&#xff0c;其中有一个说到点右上角的三个点 2、点击设置…

构建滴滴业务中台:系统架构设计探索

在当今数字化时代&#xff0c;滴滴作为中国领先的出行平台&#xff0c;承载着数亿用户的出行需求&#xff0c;业务规模庞大且复杂多样。为了更好地支撑业务发展和提升服务质量&#xff0c;滴滴不断探索和构建业务中台&#xff0c;以实现业务的快速响应、灵活运营和持续创新。在…

深度学习之神经网络理论基础

深度学习之神经网络理论基础 人工神经元 人工神经元&#xff1a;人类神经元中抽象出来的数学模型 MP模型 mp模型&#xff1a;1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元&#xff0c;称为M-P模型。 M-P神经元&#xff08;一个用来模拟生物行为的数学模…

FileLink内外网文件交换系统解决方案

FileLink内外网文件交换系统&#xff0c;作为一种高效且安全的文件传输解决方案&#xff0c;在多个应用场景中发挥着不可替代的作用。无论是在企业内部不同子网间的文件交换&#xff0c;还是企业与外部合作伙伴之间的文件共享&#xff0c;FileLink都能提供稳定可靠的解决方案。…

Qt---文件系统

一、基本文件操作 1. QFile对文件进行读和写 QFile file( path 文件路径) 读&#xff1a; file.open(打开方式) QlODevice::readOnly 全部读取->file.readAll()&#xff0c;按行读->file.readLine()&#xff0c;atend()->判断是否读到文件尾 …

算法课程笔记——自下而上树形DP

算法课程笔记——自下而上树形DP #include<bits/stdc.h>usingnamespacestd; constintN100005; intn,a[N]; longlongdp[N][2]; vector<int> e[N]; voiddfs(intu){for(autov:e[u]){dfs(v);dp[u][1]dp[v][0];dp[u][0]max(dp[v][0],dp[v][1]);}dp[u][1]a[u]; } intmain…

一个API接口对接ChatGPT3.5/4.0,Claude3,文心一言,通义千问,智谱AI等多款AI模型,打造属于自己的AI应用

今天我要给大家介绍团队的最新项目——一个集成了ChatGPT-3.5/4.0、Claude3、文心一言、通义千问、智谱AI等多个AI模型的API模型聚合平台。仅需使用一个接口就可以对接所有AI模型 为什么要创建这个平台&#xff1f; 随着不同的AI模型陆续问世&#xff0c;每个模型都有其独特…

怎么获得公网IP?

什么是公网IP 在计算机网络中&#xff0c;公网IP&#xff08;Internet Protocol&#xff09;是指可以直接被互联网访问和通信的IP地址。相对应的&#xff0c;私网IP则是在局域网内使用的IP地址&#xff0c;无法直接被互联网访问。获得公网IP对于一些特定的网络需求非常重要&am…

C++的相关知识集

1、C概述 1 两大编程思想 c语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c继承了c语言高效&#xff0c;简洁&#xff0c;快速和可移植的传统。 2 起源 与c语言一样&#xff0c;c也是在贝尔实验室诞生的&#xff0c;Bjarne Stroustrup(本贾尼斯特劳斯特卢普)在2…

解锁AI写作新纪元的文心一言指令

解锁AI写作新纪元的文心一言指令 在人工智能&#xff08;AI&#xff09;飞速发展的今天&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术取得了显著的进步。文心一言&#xff0c;作为NLP领域的一颗璀璨明星&#xff0c;以其强大的文本生成和指令理解能力&#xff0c;为…