当前位置: 首页 > news >正文

SpringBoot项目防止接口重复提交(简单拦截器实现方案)

基于SpringBoot框架来开发业务后台项目时,接口重复提交是一个常见的问题。为了避免这个问题,我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能,本文将介绍如何使用基于SpringBoot实现这个功能。

  1. 首先,我们需要引入一个Aop依赖。在pom.xml文件中添加如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 创建一个自定义注解@NoRepeatSubmit,用于标记需要拦截的接口:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {/*** 设置请求锁定时间,默认为5秒*/int lockTime() default 5;
}
  1. 创建一个拦截器类NoRepeatSubmitInterceptor,实现HandlerInterceptor接口,并在其中实现拦截逻辑:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.UUID;
import java.util.concurrent.TimeUnit;@Aspect
@Component
public class NoRepeatSubmitInterceptor implements HandlerInterceptor {@Pointcut("@annotation(com.example.demo.annotation.NoRepeatSubmit)")public void noRepeatSubmitPointcut() {}@Around("noRepeatSubmitPointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {// 获取请求参数中的token值HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpSession session = request.getSession();String token = session.getAttribute("token").toString();// 判断是否已经提交过请求,如果已经提交过并且时间间隔小于锁时间,则直接返回成功结果,否则认为是重复提交,抛出异常并锁定sessionif (isSubmitted(token)) {String lockKey = UUID.randomUUID().toString();session.setAttribute(lockKey, System.currentTimeMillis());throw new RuntimeException("请勿重复提交");} else {session.setAttribute("token", token);return joinPoint.proceed();}}private boolean isSubmitted(String token) {HttpSession session = request.getSession();Object lockKey = session.getAttribute(token);if (lockKey == null) {return false;} else {long lockTime = (Long) session.getAttribute(token);if (lockTime > 0 && System.currentTimeMillis() - lockTime < TimeUnit.SECONDS.toMillis(5)) {return true;} else {session.removeAttribute(token);return false;}}}
}
  1. 注册拦截器

实现HandlerInterceptor接口的重写,重写preHandle、postHandle、afterCompletion方法。拦截器中的方法执行流程为 preHandle → controlle → postHandle → afterCompletion。然后需要将拦截器注册到容器中,可以通过实现WebMvcConfigurer的addInterceptors方法来实现。下面是一个简单的例子:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new NoRepeatSubmitInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/register");}
}
  1. 在需要进行拦截的接口上添加@NoRepeatSubmit注解,例如:
@RestController
public class UserController {@NoRepeatSubmit // 添加此注解表示该接口需要拦截重复提交请求@GetMapping("/submit")public String submit() {// 处理业务逻辑...return "success";}
}

通过以上步骤,我们实现了一个简单的后台拦截接口重复提交的功能。在实际项目中,还需要考虑更多的细节,例如如何保证锁的释放、如何处理并发请求等。但这个示例应该能帮助你入门SpringBoot拦截器的使用。

相关文章:

SpringBoot项目防止接口重复提交(简单拦截器实现方案)

基于SpringBoot框架来开发业务后台项目时&#xff0c;接口重复提交是一个常见的问题。为了避免这个问题&#xff0c;我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能&#xff0c;本文将介绍如何使用基于SpringBoot实现这个功能。 首先&#xff0c;我们需要引入一…...

C语言 数据结构与算法 I

C语言-数据结构与算法 C语言基础 因为之前写算法都是用C&#xff0c;也有了些C基础&#xff0c;变量常量数据类型就跳过去吧。 首先是环境&#xff0c;学C时候用Clion&#xff0c;C语言也用它写吧~ 新建项目&#xff0c;选C执行文件&#xff0c;语言标准。。。就先默认C99吧…...

PHP指定时间戳/日期加一天,一年,一周,一月

PHP指定时间戳加上1天&#xff0c;1周&#xff0c;1月&#xff0c;一年其实是不需要用上什么函数的&#xff01;指定时间戳本身就是数字整型&#xff0c;我们只需要再计算1天&#xff0c;1周它的秒数相加即可&#xff01; 博主搜索php指定时间戳加一天一年&#xff0c;结果许多…...

前端框架 vue-admin-template的搭建运行

一介绍 1.1 下载地址 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub - PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 1.2 node.js的安装 地址下载node.js 1.6版本 CNPM Binari…...

Git—版本控制系统

git版本控制系统 1、什么是版本控制2、常见的版本控制工具3、版本控制分类3.1、本地版本控制3.2、集中版本控制 SVN3.3、分布式版本控制 Git 4、Git与SVN的主要区别5、Git环境配置6、启动Git7、常用的Linux命令8、Git配置9、设置用户名与邮箱&#xff08;用户标识&#xff0c;必…...

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…...

移动安全测试框架-MobSF WINDOWS 环境搭建

安装python python-3.11.5-amd64.exe 安装Win64OpenSSL-3_1_2.exe 安装VisualStudioSetup.exe github下载安装包 https://github.com/MobSF/Mobile-Security-Framework-MobSF/archive/refs/heads/master.zip GitHub - MobSF/Mobile-Security-Framework-MobSF: Mobile Secur…...

QT连接OpenCV库完成人脸识别

1.相关的配置 1> 该项目所用环境&#xff1a;qt-opensource-windows-x86-mingw491_opengl-5.4.0 2> 配置opencv库路径&#xff1a; 1、在D盘下创建一个opencv的文件夹&#xff0c;用于存放所需材料 2、在opencv的文件夹下创建一个名为&#xff1a;opencv3.4-qt-intall 文…...

使用 ElasticSearch 作为知识库,存储向量及相似性搜索

一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代&#xff0c;快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎&#xff0c;为我们提供了一种优秀的解决方案。除了传统的文本搜索&#xff0c;El…...

视频图像处理算法opencv在esp32及esp32s3上面的移植,也可以移植openmv

opencv在esp32及esp32s3上面的移植 Opencv简介 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上&#xff0c;它轻量级而且高效——由一系列 C 函数和少量…...

2. postgresql并行扫描(1)——pg强制走并行扫描建表及参数配置

转载自&#xff1a;https://developer.aliyun.com/article/700370 1. 参数设置 1.1 postgresql.conf中修改 # 1、总的可开启的WORKER足够大 max_worker_processes 128# 2、所有会话同时执行并行计算的并行度足够大 max_parallel_workers64# 3、单个QUERY中并行计算NODE开…...

【C++】动态内存管理

【C】动态内存管理 new和delete用法内置类型自定义类型抛异常定位new 刨析new和delete的执行与实现逻辑功能执行顺序newdelete 功能实现operator new与operator delete malloc free与new delete的总结 在我们学习C之前 在C语言中常用的动态内存管理的函数为&#xff1a; mallo…...

MATLAB R2023a完美激活版(附激活补丁)

MATLAB R2023a是一款面向科学和工程领域的高级数学计算和数据分析软件&#xff0c;它为Mac用户提供了强大的工具和功能&#xff0c;用于解决各种复杂的数学和科学问题。以下是MATLAB R2023a Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;MATLAB R2023a完美激活版 …...

垃圾回收 - 标记压缩算法

压缩算法是将标记清除算法与复制算法相结合的产物。 1、什么是标记压缩算法 标记压缩算法是由标记阶段和压缩阶段构成。 首先&#xff0c;这里的标记阶段和标记清除算法时提到的标记阶段完全一样。 接下来我们要搜索数次堆来进行压缩。压缩阶段通过数次搜索堆来重新填充活动对…...

Vue中过滤器如何使用?

过滤器是对即将显示的数据做进⼀步的筛选处理&#xff0c;然后进⾏显示&#xff0c;值得注意的是过滤器并没有改变原来 的数据&#xff0c;只是在原数据的基础上产⽣新的数据。过滤器分全局过滤器和本地过滤器&#xff08;局部过滤器&#xff09;。 目录 全局过滤器 本地过滤器…...

【爬虫】7.4. 字体反爬案例分析与爬取实战

字体反爬案例分析与爬取实战 文章目录 字体反爬案例分析与爬取实战1. 案例介绍2. 案例分析3. 爬取 本节来分析一个反爬案例&#xff0c;该案例将真实的数据隐藏到字体文件里&#xff0c;即使我们获取了页面源代码&#xff0c;也无法直接提取数据的真实值。 1. 案例介绍 案例网…...

Linux cat 的作用

Linux中的cat命令用于连接文件并打印到标准输出设备&#xff08;通常是终端&#xff09;。 它的主要作用有以下几点&#xff1a; 查看文件内容&#xff1a;cat命令可用于查看文本文件的内容&#xff0c;将文件的内容从第一行到最后一行打印到终端。 合并文件&#xff1a;cat命…...

Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

转载&#xff1a;电脑知识收藏夹 Blog Archive Windows中的命令行提示符里的Start命令执行路径包含空格时的问题 当使用Windows 中的命令行提示符执行这段指令时(测试Start命令执行带空格的路径的程序或文件问题)&#xff0c;第一行Start会成功执行&#xff0c;跳出记事本程…...

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(上)

前言 今天&#xff0c;小编我也要进入计算机网络的整个内容&#xff0c;虽然这个计算机网络的内容在考研部分中占比比较小&#xff0c;有些人不把这一部分当成重点&#xff0c;这种想法是错误的。我觉得考研的这四个内容都是非常重要的&#xff0c;我们需要进行全力以赴的对待每…...

学校宿舍智能水电表管理系统:为节约资源保驾护航

随着科技的不断发展&#xff0c;越来越多的学校开始重视宿舍管理的智能化。其中&#xff0c;智能水电表管理系统作为一项重要的基础设施&#xff0c;已经逐渐被各大高校引入。本文将围绕学校宿舍智能水电表管理系统展开详细介绍&#xff0c;让我们一起来了解一下这个节约资源、…...

OAuth 2.0 and OIDC 三大安全机制对比:State vs Nonce vs PKCE

一、问题背景 OAuth 2.0 和 OpenID Connect 的授权流程依赖浏览器重定向&#xff0c;这天然暴露了多种攻击面&#xff1a; 攻击类型描述CSRF攻击者诱导用户的浏览器携带恶意授权码完成绑定Token 重放窃取的 id_token 被重复提交给客户端授权码劫持恶意应用在同一设备上拦截授…...

别再死记硬背了!用MATLAB手把手教你画根轨迹图(附代码与避坑指南)

MATLAB实战&#xff1a;从零绘制根轨迹图的完整指南与避坑技巧 在控制系统的设计与分析中&#xff0c;根轨迹图是理解系统动态特性的重要工具。传统教学中&#xff0c;学生往往被要求死记硬背绘制规则&#xff0c;却难以理解其实际应用价值。本文将彻底改变这一现状——通过MAT…...

终极指南:如何用BabelDOC彻底解决PDF翻译格式错乱问题

终极指南&#xff1a;如何用BabelDOC彻底解决PDF翻译格式错乱问题 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 还在为学术论文翻译后排版全乱而烦恼吗&#xff1f;&#x1f62b; 技术文档翻…...

如何3秒破解百度网盘提取码难题:开源工具baidupankey的技术解析与实战指南

如何3秒破解百度网盘提取码难题&#xff1a;开源工具baidupankey的技术解析与实战指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾在寻找百度网盘资源时&#xff0c;被一个小小的提取码卡住&#xff0c;不得不花费…...

OpenClawTuto:从零构建高可靠GUI自动化脚本的工程实践指南

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“OpenClawTuto”。光看名字&#xff0c;你可能会有点懵&#xff0c;这“OpenClaw”是啥&#xff1f;是开源爪子&#xff1f;还是某种工具&#xff1f;其实&#xff0c;这是一个围绕“OpenClaw”这个…...

多智能体强化学习环境PettingZoo:从核心概念到工程实践

1. 项目概述&#xff1a;从零理解PettingZoo如果你正在寻找一个能让你快速上手、高效构建多智能体强化学习&#xff08;Multi-Agent Reinforcement Learning, MARL&#xff09;实验环境的工具&#xff0c;那么Farama Foundation旗下的PettingZoo项目&#xff0c;绝对是你绕不开…...

【2026年阿里巴巴集团暑期实习- 5月16日-算法岗-第二题- 坏掉的键盘】(题目+思路+JavaC++Python解析+在线测试)

题目内容 小明准备输入一个仅由小写英文字母组成的字符串,但他的键盘在一开始就有且仅有一个按键失灵,导致该字母在原串中的所有出现都没有被输入,最终得到的字符串为 sss。小明还告诉你:原本要输入的完整字符串中任意相邻两个字符都不相同。 请你计算,对于每一个可能的…...

ARM CoreSight SoC-400调试系统勘误解析与解决方案

1. CoreSight SoC-400调试系统深度解析在嵌入式系统开发领域&#xff0c;调试与跟踪技术是确保系统可靠性的关键环节。作为ARM架构下的核心调试解决方案&#xff0c;CoreSight SoC-400系列为开发者提供了强大的硬件支持。今天我将结合多年实战经验&#xff0c;深入剖析这个系统…...

SQL学习指南——背景知识

关系型数据库中每个数据表都包含能够唯一标识某一行的信息&#xff08;称为主键 primary key&#xff09;&#xff0c;以及完整描述实体所需的额外信息 一些数据表中还包含了导航到其他数据表的信息&#xff0c;这些列称为外键&#xff08;foreign key) 术语术语定义实体数据库…...

FTDI Friend:从USB转串口到AVR编程的嵌入式开发利器

1. 项目概述&#xff1a;为什么你需要一个FTDI Friend&#xff1f;在嵌入式开发和单片机玩家里&#xff0c;串口通信就像空气和水一样基础且不可或缺。无论是给Arduino上传代码&#xff0c;还是让树莓派和传感器模块“说上话”&#xff0c;亦或是调试一个自己焊的STM32最小系统…...