SpringBoot拦截器的使用

news2024/9/24 19:19:30

Hi I’m Shendi



SpringBoot拦截器的使用


简介

最近要实现一个全局对象的传递,在接口中直接通过增加函数参数来直接使用的这种方式

之前一直使用的是过滤器,但这种需求过滤器是没有办法实现的,过滤器可以给请求注入字符串,但不能注入对象

例如 User 类,想要的效果如下

public String test(User user) {
	return user.toString();
}

经过使用,拦截器也不能实现这样的效果…

可以使用addArgumentResolvers来实现,参考 https://sdpro.top/blog/html/article/1047.html


SpringBoot拦截器和Servlet的过滤器类似,相当于基于AOP的函数拦截,拦截器可以用来进行身份验证、日志记录、请求参数处理等。



创建拦截器

有两种方法

  • 实现 org.springframework.web.servlet.HandlerInterceptor
  • 继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter
    • 这个我用的时候已经被标记弃用了,并且我看实现的AsyncHandlerInterceptor接口,而AsyncHandlerInterceptor实现HandlerInterceptor,所以建议使用第一种

接口代码如下

在这里插入图片描述


可以看到接口定义了三个默认行为,分别为如下

名称描述
preHandle在请求处理前执行,可以理解为过滤器的 chain.doFilter 上面部分代码,有一个boolean返回值,返回true则会继续执行,否则不继续执行
postHandle在请求处理完执行,可以理解为过滤器的 chain.doFilter 后面部分代码
afterCompletion处理完执行,在postHandle之后。可以理解为finally

代码如下

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class DefaultIntercept implements HandlerInterceptor {
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("pre");
		return true;
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("post");
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("after");
	}
	
}


配置拦截器

要使拦截器生效,还需要进行以下操作

  • 创建类,实现WebMvcConfigurer接口
  • 实现addInterceptors函数
  • 在函数内使用 registry.addInterceptor 来使拦截器生效

例如

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(defaultIntercept()).addPathPatterns("/**");
    }
    
    @Bean
    public DefaultIntercept defaultIntercept() {
    	return new DefaultIntercept();
    }
    
}

后面的 addPathPatterns 为匹配的规则,具体可以参考文档,/** 就代表全部



运行测试

随便建个接口,试试拦截器效果

@GetMapping("/")
public String get() {
    System.out.println("接口执行");
    return "test";
}

请求后控制台输出如下

在这里插入图片描述


在pre的时候 return false 看一下结果

在这里插入图片描述

可以看到执行了pre后就没有继续执行了



调整优先级

在配置类,添加拦截器的时候可以使用 order 函数指定

registry.addInterceptor(defaultIntercept()).addPathPatterns("/**").order(1);

值越小,优先级越高,不配置默认是0,如果没有指定,那么将按照加入的先后顺序进行拦截




END

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

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

相关文章

【Spring】Spring的数据库开发

目录 1.Spring JDBC1.1 Spring JdbcTemplate的解析1.2 Spring JDBC的配置 2 Spring JdbcTemplate的常用方法2.1 execute()——执行SQL语句2.2 update()——更新数据2.3 query()——查询数据 1.Spring JDBC 1.1 Spring JdbcTemplate的解析 针对数据库的操作,Spring…

FreeRTOS - 二值信号量

一.信号量定义 信号量(semaphore),多任务环境下使用的一种设施,负责协调多个任务,以保证任务能够正确,合理的使用公共资源。 二.二值信号量应用函数 函数原型#include “FreeRTOS.h”#include “semphr.h”…

我国纯电动汽车行业开始从“政策导向”向“消费导向”转变 未来机遇挑战并存

1、纯电动汽车概念及其优缺点情况 新能源汽车以能源供给方式主要可以分为纯电动汽车、混合动力汽车以及燃料电池汽车。其中,纯电动汽车则是指完全由可充电电池(如铅酸电池、镍镉电池、镍氢电池或锂离子电池)提供动力源,用电机驱动…

华纳云:Pycharm无法正常安装第三方库怎么解决?

这篇文章主要介绍“Pycharm无法正常安装第三方库怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Pycharm无法正常安装第三方库怎么解决”文章能帮助大家解决问题。 1.首先检查自…

MongoDB常用语句(CURD)

文章目录 一、数据库操作二、集合操作三、文档操作3.1 插入文档3.2 查询文档3.3 更新文档3.4 删除文档 四、安全认证4.1 创建管理员账号4.2 创建应用数据库用户4.3 启动和连接 (校验方式) 提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 一…

【达摩院OpenVI】视频目标渐进式Transformer跟踪器ProContEXT

论文&代码 论文链接:[arxiv]代码&应用: 开源代码:[github code]开源应用:[modelscope] 背景介绍 视频目标跟踪(Video Object Tracking, VOT)任务以一段视频和第一帧中待跟踪目标的位置信息&…

为什么使用了索引,查询还是慢?

🏆今日学习目标: 🍀为什么使用了索引,查询还是慢? ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区&…

一、适配各大数据库之前言

一、适配各大数据库之前言 简介 本系列主要记录基于【用户权限服务】(一个SpringBoot服务的名称,不重要,只要是web项目都可以,为了方便描述,以下就简称 “用户中心”),适配各大数据库的过程,其中包括SQL Server、Oracle、PostgreSql、达梦、金仓、MYSQL等等,其次还记…

Docker容器---docker-compose

docker容器---compose容器集群的快速编排 一、Docker-compose简介二、yml文件格式及编写注意事项1、yml文件格式2、yml文件格式注意事项 三、编写docker-compose( nginxtomcat 实例)1、dockerfile撰写 nginx 镜像2、dockerfile撰写 tomcat 镜像3、将所需…

基于html+css的图片展示32

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

java 7大设计原则

一、设计模式七大原则 设计模式的目的 代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)可靠…

关于今年五一调休。。

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

Spring5学习总结(三)JdbcTemplate实现数据库增删改查操作JdbcTemplate实现批量增删改操作

Spring5学习总结(三)JdbcTemplate实现数据库增删改查操作/JdbcTemplate实现批量增删改操作 一、JdbcTemplate概述 什么是 JdbcTemplate? JdbcTemplate是Spring 框架对 JDBC 进行的封装,使用它可以更方便实现对数据库的操作。 二…

Redis序列化设置以及jetcache连接Redis序列化的设置

1、问题 问题:我在使用jetchche进行连接redis的时候,存入redis的value一直使用的是redis默认的序列化方式,是使用的jdk序列化。当我使用jetcache向redis存入一个对象 存入redis的结果: 这是使用jdk序列化的结果。 但是我记得使用redis的时候…

密码学期末复习(按考点整理,超详细!!!)

复习目录) 题型第一章密码算法的安全性分类密码分析的难易程度凯撒密码加密原理古典密码中仿射变换的解密变换 第二章流密码的组成和特点流密码的基本思想 第三章分组密码的CBC工作模式,以及该模式的加密示意图AES中字节求逆雪崩效应分组密码的安全设计原…

让HR眼前一亮:30个APP项目软件测试经验,点燃你的简历

在求职过程中,我们都希望自己的简历能够吸引面试官的眼球,从而获得更多的面试机会。作为一名软件测试人员,丰富的实战经验是让自己脱颖而出的关键之一。 在我多年从事APP项目软件测试的工作中,我积累了大量的实践经验&#xff0c…

Java 之 String、StringBuffer与StringBuilder 区别

String String 是被 final 修饰的类,不能被继承;String实现了 Serializable 和Comparable接口,表示String支持序列化和可以比较大小;String底层是通过char类型的数据实现的,并且被final修饰,所以字符串的值…

大数据5--spark

1.Spark 定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 Spark 是什么 Spark 最早源于一篇论文 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing, 该论文是由加州大学柏克莱…

vue3中其他的变化

1.全局API的转移 Vue 2.x 有许多全局 API 和配置。 - 例如&#xff1a;注册全局组件、注册全局指令等。 //注册全局组件 Vue.component(MyButton, {data: () > ({count: 0}),template: <button click"count">Clicked {{ count }} times.</button> …

微信小程序+wx.connectSocket客服问答

项目需求&#xff0c;记录一下&#xff1a; 1.要求websocket实时返回会话结果 我项目这边是后端一次返回一个字&#xff0c;–finish–结束&#xff0c;所以实现方法是每获取到数据时就setData一次&#xff0c;直到获取到的数据为finish&#xff0c;停止setData 后端返回结果…