token令牌防止重复提交的问题

2024-06-07 09:08

本文主要是介绍token令牌防止重复提交的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人前段时间在公司参数了一个商城的项目,负责购物车+订单等一系列模块,但是这一块有个很大的隐患就是数据重复提交的问题,比如在下订单的时候以及确认购买付款的时候如果用户因为某些原因在短时间内连续点击了很多次,那么就会造成数据重复提交,然后本人也专门去网上找了一些资料,然后集合自身的代码,胜利解决了此问题,本篇博文目的只是为了记录下这个东西,一方面是自己能把某一功能自己写下来的话可以加深自己的理解,另一方面也是想可以帮助到有需要的人,本篇博文为原创,如有问题,请私信 欢迎指正~


以前再没用spring,用Struts2的时候也做过类似的功能,当时实现token令牌机制是在jsp页面生成一个随机数,然后放进session中保存,并把这个随机数当做请求的参数传到后台,后台获取到这个参数token之后再从session中通过相同的参数名获取到session中的token,然后两个token判断一下,相同就是同一次请求,并立即删除session中的token,这样的话 你通过页面回退之后再点击提交,session中就已经不存在这个token,就无法重复提交了。


这次的逻辑是一样的,只不过换了一种实现的方式,用自定义注解+拦截器实现,具体如下:

  1. 先自定义一个注解类,元注解@Target和@Retention即可,然后自定义两个方法,方法名随便但不要随便,一个是用来标识生成token,一个是删除
  2. 再自定义一个拦截器,基本逻辑是利用反射,获取到需要被拦截的请求,然后判断一下,比如你在某个请求需要做防止重复提交,那么就在进入该页面的controller的方法上,使用你第一步自定义的注解,并设置save()为true,然后拦截器就会判断,如果为true就表面需要防止重复提交,就会随机生成一串东西,可以自定义 也可以用uuid,然后放进session中,并起个参数名(和之前直接在jsp上生成是一样的道理)。然后在最终提交数据的controller方法上使用remove().true,这样就会进行两个token的一系列的判断
  3. 第三步就是配置拦截器
  4. 接下来就是关键,在进入到你需要提交的页面的controller方法上使用你的自定义注解
  5. 在提交数据的controller方法上删除
  6. 最后一个步骤,首先需要再页面获取到session中的token并放入隐藏域中,最后如果你是ajax提交的数据,记得一定要把token当做参数提交上去,否则后台无法获取到你页面提交的token值,就无法和session中的作比较
基本上大致步骤和代码就是这些。



http://blog.csdn.net/Ice166/article/details/78466974

这篇关于token令牌防止重复提交的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038744

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异