SpringBoot统一功能处理——拦截器

news2024/9/22 23:27:11

目录

一、什么是拦截器?

二、拦截器使用

2.1 定义拦截器

2.2 注册配置拦截器 

三、拦截器详解

3.1 拦截器的拦截路径配置

3.2 拦截器执行流程


一、什么是拦截器?

拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码。

二、拦截器使用

2.1 定义拦截器

自定义拦截器:实现HandlerInterceptor接口,并重写所用到的方法:
  • preHandle()方法:目标方法执行前执行。 返回true: 继续执行后续操作; 返回false: 中断后续操作。
  • postHandle()方法:目标方法执行后执行。
  • afterCompletion()方法:视图渲染完毕后执行,最后执行。
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
 
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler) throws Exception {
 log.info("LoginInterceptor 目标⽅法执⾏前执行..");
 return true;
 }

 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse 
response, 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 视图渲染完毕后执行,最后执行");
 }
}

2.2 注册配置拦截器 

实现WebMvcConfigurer接口,并重写addInterceptors方法:
@Configuration
public class WebConfig implements WebMvcConfigurer {
 //⾃定义的拦截器对象
 @Autowired
 private LoginInterceptor loginInterceptor;
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
 //注册⾃定义拦截器对象
 registry.addInterceptor(loginInterceptor)
 .addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表⽰拦截所有请求)
 }
}

三、拦截器详解

3.1 拦截器的拦截路径配置

拦截路径是指定义的这个拦截器, 对哪些请求生效。我们在注册配置拦截器的时候, 通过 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

3.2 拦截器执行流程

正常的调用顺序:

有了拦截器之后,会在调用 Controller 之前进行相应的业务处理,执行的流程如下:
  • 添加拦截器后, 执行Controller的方法之前, 请求会先被拦截器拦截住。执行 preHandle() 方法,这个方法需要返回一个布尔类型的值。如果返回true, 就表示放行本次操作, 继续访问controller中的方法。如果返回false,则不会放行(controller中的方法也不会执行)。
  • controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据。

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

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

相关文章

C语言 | Leetcode C语言题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; char* id2str[26 * 26 * 26];int str2id(char* a) {int ret 0;for (int i 0; i < 3; i) {ret ret * 26 a[i] - A;}return ret; }int cmp(const void* _a, const void* _b) {int **a (int**)_a, **b (int**)_b;return (*b)[0] - (*…

python网络爬虫使用代理

Python网络爬虫使用代理的实用指南 在网络爬虫的开发过程中&#xff0c;使用代理是一个非常重要的环节。代理不仅可以帮助爬虫绕过反爬虫机制&#xff0c;还能保护开发者的隐私。本文将介绍如何在Python中使用代理进行网络爬虫&#xff0c;包括基本的设置和示例代码。 1. 代理…

手机短视频素材网站有哪些啊?手机视频素材库网站分享

在当今的数字时代&#xff0c;智能手机与社交媒体平台的融合推动了手机短视频的兴起。这种形式的媒体已经渗透到我们的日常生活中&#xff0c;无论是作为娱乐手段、教育工具还是商业推广手段&#xff0c;优质的短视频都具有极高的吸引力和广泛的应用价值。因此&#xff0c;选择…

『 C++ 』智能指针 ( 万字梳理 )

文章目录 智能指针概念内存泄漏的危害RAII与智能指针智能指针的赋值auto_ptr 管理权转移auto_ptr 的对象悬空问题 unique_ptr 防拷贝unique_ptr 简单实现 shared_ptr 引用计数shared_ptr 简单实现shared_ptr 的循环引用问题与 weak_ptr 智能指针的自定义删除器 智能指针概念 智…

【独家原创】基于NRBO-Transformer多特征分类预测【24年新算法】 (多输入单输出)Matlab代码

【独家原创】NRBO-Transformer分类 Matlab代码 基于牛顿拉夫逊优化算法优化Transformer的数据分类预测&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 NRBO优化的超参数为&#xff1a;自注意力机制中的头数、正则化系数、初始化学习率 1.程序已经调试…

《知识点扫盲 · Redis 分布式锁》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

数据库索引设计原则

1. 概述 索引是优化数据库性能最重要的工具之一。但是&#xff0c;创建过多的索引或索引错误的列也会对性能产生负面影响。因此&#xff0c;在设计索引时遵循一定的原则很重要。 2. 原则A - 根据工作负载创建索引 创建高效索引最重要的原则是根据您的工作负载而不是表结构创…

数据库连接池的深入学习

为什么需要数据库连接池&#xff1f; 正常操作数据库需要对其进行连接&#xff0c;访问数据库&#xff0c;执行sql语句&#xff0c;断开连接。 创建数据库连接是一个昂贵的过程&#xff0c;在高并发的情况下&#xff0c;频繁的创建数据库的连接可能会导致数据库宕机。 有了连…

Leetcode JAVA刷刷站(8)字符串转换整数

一、题目概述 二、思路方向 要实现这个功能&#xff0c;我们可以遵循以下步骤来编写 myAtoi 函数&#xff1a; 去除前导空格&#xff1a;使用循环或字符串的 trim() 方法&#xff08;虽然直接操作字符串更高效的方式是使用循环&#xff09;。检查符号&#xff1a;记录第一个非…

TGANet部分复现

Kvasir-SEG复现结果 M e t h o d m I o U m D S C R e c a l l P r e c i s i o n F 2 P r a N e t − − − − − − 0.9663704860609511 − − T G A N e t 0.8331 0.8982 0.9132 − − 0.9029 \begin{array}{lccccr} Method&mIoU&mDSC&Recall&Precision&a…

5、Linux : 网络相关

OSI七层网络模型 TCP/IP四层 概念模型 对应网络协议 应用层&#xff08;Application&#xff09; HTTP、TFTP, FTP, NFS, WAIS、 表示层&#xff08;Presentation&#xff09; 应用层 Telnet, Rlogin, SNMP, Gopher 会话层&#xff08;Session&#xff09; SMTP…

ICETEK-DM6437-AICOM——CPU定时器及直流电机控制中断控制

一、设计目的&#xff1a; 1.1 CPU定时器程序设计&#xff1b; 1.2 2直流电机程序设计&#xff1b; 1.3 外中断。 二、设计原理&#xff1a; 2.1 定时器的控制&#xff1a; 在DM6437&#xff08;是一种数字信号处理器&#xff0c;DSP&#xff09;上使用其内部定时器和中断来…

设计模式-动态代理模式

目录 什么是代理模式&#xff1f; 为什么要用代理模式&#xff1f; 有哪几种代理模式&#xff1f; 动态代理&#xff08;jdk自带&#xff09;&#xff1a; 动态代理&#xff08;第三方库-cglib&#xff09;&#xff1a; 什么是代理模式&#xff1f; 代理模式给某一个对象提供…

Windows10不能直接拖拽文件到微信或者钉钉的解决办法【玖毅网】

不知道从何时起,微信、QQ和钉钉等相关软件,无法拖拽文件到对话窗口,拖拽的时候显示一个红色图标,可能是上次更新win之后导致的,所以嘛,系统真的不能设置自动更新,说不准哪些更新就把原设置覆盖或者关闭了,哎,吃一堑长一智吧,赶紧关闭自动更新,emmmm我在说我自己啊。…

日撸Java三百行(day17:链队列)

目录 一、队列基础知识 1.队列的概念 2.队列的实现 二、代码实现 1.链队列创建 2.链队列遍历 3.入队 4.出队 5.数据测试 6.完整的程序代码 总结 一、队列基础知识 1.队列的概念 今天我们继续学习另一个常见的数据结构——队列。和栈一样&#xff0c;队列也是一种操…

零基础5分钟上手谷歌云GCP核心云开发技能 - 利用语音AI服务搭建应用

简介&#xff1a; 欢迎来到小李哥全新谷歌云GCP云计算知识学习系列&#xff0c;适用于任何无云计算或者谷歌云技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会谷歌云一个经典的服务开发架构方案。 我将每天介绍一个基于全球三大云计算平台&#xff0…

arcgis(shp)注记转CAD(dwg)文字

arcgis&#xff08;shp&#xff09;注记转CAD&#xff08;dwg&#xff09;文字方法如下&#xff1a; 1、添加shp文件&#xff0c;标注要素&#xff0c;然后选标注转注记 2、 点击文件夹图标打开文件夹&#xff0c;选择保存路径。&#xff08;提前需新建好文件地理数据库、数据…

Arm Linux 设置系统日期时间的方法

一、设置系统日期时间的方法 1.命令行工具 date 命令&#xff1a;是Linux系统中用于查看和设置系统时间的常用命令行工具。通过date -s选项&#xff0c;可以手动设置系统时间。 sudo date -s "YYYY-MM-DD HH:MM:SS"hwclock 命令&#xff1a;用于查询和设置硬件时钟…

8月8日复习内容(基础的文件IO操作)

man手册 主要分为以下几个章节&#xff1a; User Commands&#xff08;用户命令&#xff09;&#xff1a;这一章节包含了普通用户&#xff08;非root用户&#xff09;可以执行的命令。这些命令通常用于日常的文件管理、文本编辑、程序执行等任务。 System Calls&#xff08;系…

【JavaEE初阶】常见的锁策略及synchronized实现原理

目录 &#x1f333; 常见的锁策略 &#x1f6a9; 乐观锁 vs 悲观锁 &#x1f6a9; 重量级锁 vs 轻量级锁 &#x1f6a9; 自旋锁 vs 挂起等待锁 &#x1f6a9; 可重入锁 vs 不可重入锁 &#x1f6a9; 公平锁 vs 非公平锁 &#x1f6a9; 互斥锁 vs 读写锁 &#x1f384; …