阿里P7告诉你SpringBoot如何防止重复提交?

SpringBoot部署到阿里云服务器完整实战指南 SpringBoot应用部署本质是构建生产级运行基座,涉及JDK环境配置、MySQL数据库服务搭建、网络策略管控及进程守护机制。其核心原理在于打通开发态与运维态的认知断层:本地IDE托管环境需迁移到Linux服务器的权限隔离、服务依赖与系统级管理逻辑。技术价值体现在稳定性(systemctl开机自启+崩溃恢复)、安全性(安全组+mysql_secure_installation)和可维护性(多环境配置+标准化日志)。典型应用场景包括个人项目上线、应届生工程实践入门及面试前部署能力强化。本文聚焦原生命令落地, 阅读详情

有两种防止重复提交:

  1. 禁用提交按钮
  2. 发出请求令牌/ ID:

禁用提交按钮

我们可以在函数调用HTTP请求之前禁用提交按钮,并在完成HTTP响应后再次启用它。该技术对于需要很长时间才能完成的过程(超过5秒)是有效的。由于不耐烦而无法获得结果,用户无法再次单击n'。此外,我们可能会显示一个正在Loading装载进度,以获得良好的体验。

<!DOCTYPE html>
<html lang="en">

<head>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>

<body>
    <form name="form-payment" id="form-payment">
        ...
    </form>

    <script type="text/javascript">
        $('#form-payment').submit(function (e) {
            e.preventDefault();
            $.ajax({
                type: 'POST',
                dataType : "json",
                contentType: "application/json; charset=utf-8",
                url: "#",
                data: "{}",
                beforeSend: function(){
                    $('#button-submit').attr('disabled', 'disable');
                },
                complete: function(){
                    $('#button-submit').removeAttr('disabled');
                },
                success: function (data) {
                        // do your success action
                },
                error: function () {
                        // do your error handler
                }
            });
        });
    </script>
</body>

在beforeSend 和complete段,我添加“ disable”属性作为开关, (jquery中有专门语句防止二次提交)

重点来了:

Spring Boot中如何发出请求令牌/ ID

这种技术实际上更复杂,更难实现,但是由于一个好的框架(如Spring Boot)使这更容易。在我们开始代码实现之前,让我们先讨论一下这个机制;

  • 加载表单页面时,发出新的requestId
  • 在调用后端服务之前将已发出的requestId发送到HTTP头
  • 后端服务标识requestId是否已注册
  • 如果requestId已经注册,那么我们可以将其标记为违规请求

我们来开始代码。这里是我的JavaScript中的示例代码,用于发出新的requestId。

 $(document).ready(function () {
        var requestId = new Date().getTime(); // <--- issue new requestId every time page laoded 

        $('#form-payment').submit(function (e) {
            e.preventDefault();
            $.ajax({
                type: 'POST',
                dataType : "json",
                contentType: "application/json; charset=utf-8",
                headers: { "requestId" : requestId }, // <--- add requestId in header
                url: "#",
                data: "{}",
                beforeSend: function(){
                    $('#button-submit').attr('disabled', 'disable');
                },
                complete: function(){
                    $('#button-submit').removeAttr('disabled');
                },
                success: function (data) {

                },
                error: function () {

                }
            });
        });
    });

这里是我的Spring Boot项目中的示例代码,我创建了一个Interceptor来处理requestId:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class Interceptor implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ViolationInterceptor()).addPathPatterns("/**");
    }

    public class ViolationInterceptor extends HandlerInterceptorAdapter {
        private List<String> requestIds = new ArrayList<>();

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String requestId = request.getHeader("requestId");

            if (requestIds.contains(requestId))
                throw new IllegalArgumentException("Violation Request; Reason requestId already registered");

            requestIds.add(requestId);
            return super.preHandle(request, response, handler);
        }
    }
}

Exception处理:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ExceptionAdvisor {

    @ExceptionHandler(IllegalArgumentException.class)
    ResponseEntity illegalArgumentExceptionHandler(IllegalArgumentException e){
        return ResponseEntity.ok(e.getMessage());
    }
}

在此示例中,我使用应用程序内存来​​存储requestId。对于认真的开发,我建议使用内存数据库,例如Redis。

实际上,我们可以在识别requestId时修改如何发布新令牌和逻辑。因为这个过程非常简单,我们需要一些东西(requestId)来识别已经请求过的东西。

写在最后:

既然看到这里了,觉得笔者写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

JavaAI实战:LangChain4j与SpringBoot快速集成阿里通义千问DashScope 本文详细介绍了如何将LangChain4j与SpringBoot快速集成阿里通义千问DashScope,实现AI大模型的高效应用。从环境搭建、API密钥安全管理到模型参数调优和对话接口实现,提供了完整的实战指南,帮助Java开发者快速掌握AI集成技术。 阅读详情

相关推荐

SpringBoot兼职招聘系统毕设源码拆解:从数据库到答辩全流程

SpringBoot作为Java后端主流框架,凭借自动配置、内嵌容器等特性,广泛用于企业级应用与毕业设计项目。一个完整的Web系统通常从数据库设计开始,经历Controller、Service、Mapper三层架构的层层调用,并结合MySQL、MyBatis实现数据持久化。登录权限、业务校验、状态流转是开发中的常见难点。以兼职招聘系统这类典型业务场景为例,涵盖学生、企业、管理员三类角色,涉及发布、申请、审核等核心流程,非常适合用来梳理SpringBoot开发全链路。面对一份能运行的源码,先理清表结构,再按一

weixin_34411563的博客 478

Redis 【第三篇】Redis缓存穿透、击穿、雪崩与相对应的解决方案,以及跳跃表实现原理

文章目录一、Jdeis概述1、简单介绍2、 基本使用二、RedisUtil工具类总结 一、Jdeis概述 1、简单介绍   (1) Jedis是Redis官方推荐的Java连接开发工具。要在Java开发中使用好Redis中间件,必须对Jedis熟悉才能写成漂亮的代码 2、 基本使用   2.1- 单实例连接   导入依赖 <dependencies> <!-- 单元测试--> <dependency>

NanYII_的博客 972

LC滤波器设计实战:从理论计算到PCB布局的完整指南

滤波器是信号处理与电路设计中的基础组件,用于从复杂信号中提取特定频率分量或抑制干扰噪声。其核心原理基于电感(L)和电容(C)等无源元件的频率选择特性,通过特定的网络拓扑实现幅频与相频特性的塑造。在工程实践中,LC滤波器因其结构简单、可靠性高、成本可控,成为射频、模拟及电源电路中的关键技术手段。其设计价值在于将理论网络综合转化为可量产、高性能的硬件解决方案,广泛应用于通信系统、音频处理、电源净化和传感器信号调理等场景。本文聚焦于LC滤波器的工程设计全流程,深入剖析了巴特沃斯、切比雪夫等经典类型的选型权衡,并重

weixin_34194829的博客 273

springboot 防止重复提交

.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(51, 51, 51, 1) } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .ma...

程序员小明1024 9424

Cadence 16.6与17.4双版本共存避坑指南:从安装顺序到环境变量配置

本文是一份详细的Cadence 16.6与17.4双版本共存实战指南。针对硬件工程师和PCB设计者同时处理新旧项目的需求,文章深入剖析了版本冲突根源,并提供了从安装顺序、环境隔离到故障排查的完整解决方案。核心在于通过环境变量精细化管理与脚本控制,实现两个版本的稳定共存与无缝切换,有效解决了文件关联混乱、交互布局失效等常见问题。

html8的博客 979

Win10 LTSC 2021 CPU占用率飙升?KB5017308补丁修复全攻略

本文针对Windows 10 LTSC 2021系统中因wsappx进程导致的CPU占用率异常飙升问题,提供了详细的解决方案。核心在于安装微软官方发布的KB5017308补丁,该补丁能从根本上修复系统组件缺陷,使CPU占用恢复正常。文章详解了补丁的下载、安装步骤、注意事项及安装后的验证方法,是解决此问题的权威指南。

python9snake的博客 1267

SpringBoot自定义注解 + AOP 防止重复提交(建议收藏)

从JDK 1.5开始, Java增加了对元数据(MetaData)的支持,也就是 Annotation(注解)。注解其实就是代码里的特殊标记,它用于替代配置文件,常见的很多,有 @Override、@Deprecated等元注解是注解的注解,比如当我们需要自定义注解时会需要一些元注解(meta-annotation),如@Target和@Retention防重提交方式token令牌方式ip+类+方法方式(方法参数)利用AOP来实现。

欢迎来到我的博客 2295

海外最新AI营销AI销售书籍推荐AI营销培训讲师AI销售培训讲师人工智能营销培训师人工智能销售培训师AI赋能营销培训AI赋能销售培训企业AI营销内训企业AI销售内训AI营销课程讲师AI销售课程讲师

专栏|AI营销与AI销售实战 · 第46期在这个人类与算法共舞的时代,销售,已经不是你我熟悉的那个“打电话、见客户、做PPT”的老行当了。你还以为销售是“打感情牌”?错了,情感要继续,但方式已经升级。你还以为AI只是“写写文案”?错了,文案只是皮毛,真正的杀器,是思维方式的重构,是认知地图的重绘。首先,我们需要明确一个事实:AI并不会消灭销售这个职业,但它必然会重新定义销售的本质。在销售领域,真正的制胜之道不是简单地采用AI工具,而是的能力。

Akibfrycc的博客 1101

SpringBoot-接口防止重复提交

在Spring Boot应用中,防止接口重复提交是一个常见的问题,特别是在处理表单提交或关键业务操作时。重复提交可能会导致数据重复插入、资源浪费或业务逻辑错误。以下是一些常见的方法来防止接口重复提交。

咕德猫宁的博客 2676

用树莓派搭建全功能NAS服务器(01):树莓派基础操作&OMV搭建

写在前面 对于文件互传来说,局域网和云盘的操作总是独立的,而且很难将两者的优势合为一体。如果想要集多种优势为一体,那么NAS应该就是较为完美的解决方案了。 在这个系列中我们尽量跳过一些枯燥的理论知识,专注于说明两件事:   1.NAS是什么&能做什么 2.搭建思路&怎么做   这中间也会涉及到一些方案的选择,同类方案我也会列出来和大家分享我已知的优缺点,有兴趣可以多种尝试。(侧重于软件) 虽然是用树莓派搭建的,但是对于debian linux系统下的NAS搭建有着很好的参

斯塔克家的真维斯的工作间 2万+

HBuilderX远程开发环境配置:Windows SSH连接实操

详细介绍如何在Windows系统中通过SSH连接远程服务器,配置HBuilderX进行高效远程开发,提升编码协作效率。全程实操演示,轻松掌握hbuilderx与远程环境的无缝对接。

weixin_35751194的博客 1192

SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战_aop防重复提交

为了实现接口的幂等性,我们需要先定义一个自定义注解。注解的作用是标记一个方法是否支持幂等性。如果支持幂等性,那么就需要对该方法进行特殊处理,使得多次调用该方法不会对结果产生影响。

2401_84424990的博客 722

【漏洞复现】Apache Tomcat远程代码执行漏洞(CVE-2024-56337)

CVE-2024-56337是一个存在于Apache Tomcat中的TOCTOU(Time-of-Check Time-of-Use)竞争条件漏洞。此漏洞源于对先前漏洞(CVE-2024-50379)的不完整修复。若默认servlet是可写的(参数readonly设置值为false,该设置为非默认设置)表示不区分大小写文件系统,在负载下并发读取和上传同一文件可以绕过Tomcat的大小写检查。攻击者可以通过构造恶意请求上传含恶意JSP代码的文件,使其触发解析并执行这些文件,从而导致远程代码执行。

李同學AI安全 3196

服务端如何防止订单重复支付!

往期热门文章:1、我司为什么禁止使用阿里巴巴Java规范? 2、字节一年,人间三年! 3、无需注解的 SpringBoot API文档生成神器! 4、京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?太刁钻了吧! 5、使用 try-catch 捕获异常真的会影响性能?文章来源:https://www.cnblogs.com/cjsblog/p/14516909.ht...

Java后端技术 236

10、皮肤 - 神经记录实验全流程解析

本博客详细介绍了皮肤-神经记录实验的全流程,涵盖实验所需的材料准备和具体操作方法。内容包括细胞外记录设备的设置、合成间质液(SIF)的制备与调节、小鼠后爪皮肤和胫神经的手术解剖步骤、清洁解剖后的记录准备、纤维分离与感受野识别方法,以及神经纤维机械响应的测量。该实验为研究神经纤维的活动与功能提供了重要的技术支持,适用于神经科学研究领域。

backprop5master的博客 186

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

蚂蚁金服六轮面试,从一个中游的公司跳槽的阿里P7,我是怎么撑过来的?

蚂蚁金服六轮面试,从一个中游的公司跳槽的阿里P7,我是怎么撑过来的?

javaAnPou的博客 869

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

springboot项目问题

1、安装oracle驱动依赖; 2、pom.xml没有提示

备忘录 451

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

记一次阿里Java电话面试的题目(2)

lz:楼主只回答了前端校验和后端校验具体其他操作不是很清楚,下面答案引用自百度百科只列举几个经典的(力争为园友提交较可信的答案)更详细的答案可以参考:http://www.bkjia.com/jingyan/471187.html1:在前端进行校验,当表单提交后,把提交按钮置灰2:表单提交后进行页面重定向,转到处理结果页面。

2301_79987255的博客 907

SpringBoot智能招聘平台开发与高并发优化实践

企业招聘系统在现代数字化转型中扮演着关键角色,其核心技术在于高效的数据处理和智能匹配算法。基于SpringBoot框架的开发方案,结合MySQL数据库和Redis缓存,能够有效支撑高并发场景下的简历处理与岗位匹配。通过余弦相似度等算法实现学生与岗位的智能匹配,配合连接池优化和异步处理技术,系统可稳定支持上千并发请求。这种技术方案特别适用于高校就业服务、大型招聘会等场景,其中智能排期和分布式锁等设计能显著提升运营效率。实际应用中,某211高校部署的测试系统使简历筛选时间减少65%,匹配准确率达到82%。

weixin_34216196的博客 395

SpringBoot+微信小程序开发社区老年健康体检系统

智慧医疗系统通过SpringBoot后端与微信小程序前端结合,为社区老年人提供便捷的健康体检服务。采用前后端分离架构,后端基于SpringBoot框架实现快速开发,前端利用微信小程序无需安装的特性降低使用门槛。系统核心功能包括体检预约、电子健康档案管理和智能数据分析,运用Redis缓存和分布式锁解决高并发问题。这种技术方案特别适合医疗健康领域,既能保证系统稳定性,又能提升老年用户的交互体验,是当前社区养老数字化转型的典型实践。

cigang4063的博客 449

蚂蚁金服的六轮面试我是强撑过来!差点OUT(面试复盘)

其实这六轮的面试下来整体感觉还是不错的,在这之前我其实面试的其他公司的时候很烂。

m0_69305074的博客 986

基于springboot框架的大学生在线摄影活动报名系统网站的设计与实现_p456017u

Hbuilderx;Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。8、AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

QQ1304979694的博客 628
上一篇: 阿里P7给你一份超详细 Spring Boot 知识清单
下一篇: 阿里P7分享最新java面试——线程面试题集合
大G哥
博客等级 码龄9年 5303粉丝 1408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值