Java实现防重复提交
欢迎访问我的个人博客:www.ifueen.com
防重复提交的重要性?
在业务开发中,为什么我们要去想办法解决重复提交这一问题发生?网上的概念很多:导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机,那么为什么会造成这种现象?前台操作的抖动,快速操作,网络通信或者后端响应慢,都会增加后端重复处理的概率,就拿我亲身经历来说,因为业务逻辑,需要进行一个"关注"操作,但是写好业务之后在测试时连续点击几下,重复地进行关注和取消关注操作,因为操作过于频繁,而服务器走过来的响应速度没有那么快地进行处理,导致重复数据插入地情况,最后导致在查询关注的时候服务器报错,这个时候,放重复提交就显得很重要了
如何防重复提交?
其实实现地方法有很多,但是原理大概都是相通的,我选择的是通过使用AOP+redis来进行处理,前端发起请求的时候需要在请求头里将token给我,然后我这边通过token+ip再加上请求的路径作为一个key存到redis里面去,设置一个合适的过期时间,下一次再从redis中取出和当前时间进行一个判断,如果大于我们设定的一个超时时间,那么就进行拦截,不让它进行下面的业务代码,并给出提示“操作频繁,请稍后重试”
代码实现
前提环境准备:SpringAOP的支持,Redis的支持
其实用文字叙述出来感觉有一点点绕,但是代码实现起来其实不难
首先我们需要自定义一个注解:
package com.ifueen.anntion;import org.springframework.stereotype.Component;import java.lang.annotation.*;/*** @author fueen* @date 2020/7/4* 自定义防重复提交注解*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface NoRepeatSubmit {/*** 默认时间 默认1秒钟* @return*/int lockTime() default 1000;
}
然后写一个AOP进行拦截处理
package com.ifueen.aspect;import com.ifueen.anntion.NoRepeatSubmit;
import com.ifueen.utils.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
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 java.util.Objects;
import java.util.concurrent.TimeUnit;/*** @author fueen* @date 2020/7/4 15:07*/
@Aspect
@Component
@Slf4j
@SuppressWarnings("all")
public class RepeatSubmitAspect {public static final String KEYPREX="noRpeat:user:";@Autowiredprivate RedisTemplate redisTemplate;/*** 进行接口防重复操作处理* @param pjp* @param noRepeatSubmit* @return*/@Around("execution(* com.ifueen.controller.*.*(..)) && @annotation(noRepeatSubmit)")public Object around(ProceedingJoinPoint pjp, NoRepeatSubmit noRepeatSubmit) throws Throwable {try {//获取requestHttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();//拿到token和请求路径StringBuilder sb = new StringBuilder();sb.append(KEYPREX).append(request.getHeader("token").toString()).append(request.getRequestURI().toString());//获取现在时间long now = System.currentTimeMillis();if (redisTemplate.hasKey(sb.toString())){//上次请求时间long lastTime= Long.valueOf(redisTemplate.opsForValue().get(sb.toString()).toString()) ;// 如果现在距离上次提交时间小于设置的默认时间 则 判断为重复提交 否则 正常提交 -> 进入业务处理if ((now - lastTime)>noRepeatSubmit.lockTime()){//重新记录时间 10分钟过期时间redisTemplate.opsForValue().set(sb.toString(),String.valueOf(now),10, TimeUnit.MINUTES);//处理业务Object result = pjp.proceed();return result;}else {return CommonResult.getFaiInstance("-1","点击的太快了,请慢一点!");}}else {//第一次操作redisTemplate.opsForValue().set(sb.toString(),String.valueOf(now),10, TimeUnit.MINUTES);Object result = pjp.proceed();return result;}}catch (Throwable e){log.error("校验表单重复提交时异常: {}", e.getMessage());return CommonResult.getFaiInstance("-1","校验重复提交时异常");}}}
AOP和注解都写好了,现在只需要在要用到的请求上面打上这个注解就可以了
其他请求需要进行防重复提交,也只需要打上这个注解即可
Java实现防重复提交相关推荐
- java mysql防重复提交_防止数据重复提交的6种方法(超简单)!
有位朋友,某天突然问磊哥:在 Java 中,防止重复提交最简单的方案是什么? 这句话中包含了两个关键信息,第一:防止重复提交:第二:最简单. 于是磊哥问他,是单机环境还是分布式环境? 得到的反馈是单机 ...
- java后端 防重复提交_后台防止表单重复提交
具体的做法: 1.获取用户填写用户名和密码的页面时向后台发送一次请求,这时后台会生成唯一的随机标识号,专业术语称为Token(令牌). 2.将Token发送到客户端的Form表单中,在Form表单中使 ...
- Java的token解决方案,SpringMVC后台token防重复提交解决方案
思路1.添加拦截器,拦截需要防重复提交的请求 2.通过注解@Token来添加token/移除token 3.前端页面表单添加(如果是Ajax请求则需要在请求的json数据中添加token值) 核 ...
- java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)
这篇博文介绍第一种方法:判断session或其他缓存中保存的token,这里以session为例,具体大家也可以自行扩展以其他的缓存实现. 这种方式比较麻烦,每次在提交表单时都必须传入上次的token ...
- 关于表单防重复提交一些东东
前阵子弄了些表单防重复提交的东西,想整理整理,免得下次要用时再四处去找,其实这里的东西还是挺简单的. 原理: 在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交.在 ...
- springBoot防重复提交
一.重复提交原因 由于客户端抖动,人为快速点击,造成服务器重复处理 二.后端防重复提交 1.基于token 访问请求到达服务器,服务器端生成token,分别保存在客户端和服务器.提交请求到达服务器,服 ...
- AOP+自定义注解token令牌和参数防重复提交实战
目录 一.哪些因素会引起重复提交? 二.重复提交会带来哪些问题? 三.订单的防重复提交你能想到几种方案? 四.自定义注解方式 4.1Java核心知识-自定义注解(先了解下什么是自定义注解) 4.1.1 ...
- 如何处理java接口防重提交
1.什么是接口防重? 在一定的时间内多次请求同一接口,同一参数.由于请求是 健康请求 ,会执行 正常的业务逻辑 ,从而产生大量的废数据. 2.问题的产生及引发的问题 举一个最简单的例子:日常开发中cr ...
- redis+aop防重复提交
文章目录 1.防重复提交注解 2.redis分布式锁 3.防止重复提交Aop 之前有记录一篇用redis+拦截器防重复提交的内容: redis+拦截器防重复提交 1.防重复提交注解 @Target(E ...
最新文章
- BCH:“变法”是以史为鉴
- 关于常见的底层驱动源码资料
- 重学hadoop技术
- c:#ifndef, #define, #endif 作用
- MySQL无法远程连接解决方案
- pythongui界面实例_wxPython:python首选的GUI库实例分享(5)
- 深度学习7-常用损失函数和自定义损失函数
- 深入理解jvm 读后感
- checkinput php,使用php检查输入字段的类型
- NumPy库常见操作总结
- 数学期望方差 expectationvariance
- 【论文笔记-01】Re-ranking Person Re-identification with k-reciprocal Encoding
- linux服务上实现web在线编辑,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 | Linux 中国...
- 实时报价查询系统C++编程实现(阿里面试题改编)
- 【Liunx_QT触摸屏不管用】
- python使用Canny算法和HoughCiecle算法实现圆的检测与定位
- 计算机应用素描色彩,美术统考素描、色彩、速写考场技巧全攻略
- vue源码分析系列一:new Vue的初始化过程
- zoj 1107 FatMouse and Cheese 逆向动态规划
- vue2 mixins混入
热门文章
- 计算机主机 滴滴响,为什么电脑一开机就滴滴响?
- 继承、多态、重载和重写
- win10关闭快速启动_总说win7最好用,不知这些强大的功能,怎知你的win10好不好用?...
- 有道云笔记的坑爹点 和 解决办法(大概是吧)
- 全球最具创新公司TOP10
- 巴菲特经常向年轻人讲述的一个关于精灵的寓言--《The Snow Ball》
- Tomcat快速入门(Tomcat安装 把一个项目发布到tomcat中 Eclipse配置Tomcat idea配置tomcat)
- 树上的小兔子,藏了服务的新逻辑
- 如何在BW中做账龄的动态显示
- C++ Excel表格解析(一、MFC工程中的应用)