欢迎访问我的个人博客: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实现防重复提交相关推荐

  1. java mysql防重复提交_防止数据重复提交的6种方法(超简单)!

    有位朋友,某天突然问磊哥:在 Java 中,防止重复提交最简单的方案是什么? 这句话中包含了两个关键信息,第一:防止重复提交:第二:最简单. 于是磊哥问他,是单机环境还是分布式环境? 得到的反馈是单机 ...

  2. java后端 防重复提交_后台防止表单重复提交

    具体的做法: 1.获取用户填写用户名和密码的页面时向后台发送一次请求,这时后台会生成唯一的随机标识号,专业术语称为Token(令牌). 2.将Token发送到客户端的Form表单中,在Form表单中使 ...

  3. Java的token解决方案,SpringMVC后台token防重复提交解决方案

    思路1.添加拦截器,拦截需要防重复提交的请求 2.通过注解@Token来添加token/移除token    3.前端页面表单添加(如果是Ajax请求则需要在请求的json数据中添加token值) 核 ...

  4. java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)

    这篇博文介绍第一种方法:判断session或其他缓存中保存的token,这里以session为例,具体大家也可以自行扩展以其他的缓存实现. 这种方式比较麻烦,每次在提交表单时都必须传入上次的token ...

  5. 关于表单防重复提交一些东东

    前阵子弄了些表单防重复提交的东西,想整理整理,免得下次要用时再四处去找,其实这里的东西还是挺简单的. 原理: 在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交.在 ...

  6. springBoot防重复提交

    一.重复提交原因 由于客户端抖动,人为快速点击,造成服务器重复处理 二.后端防重复提交 1.基于token 访问请求到达服务器,服务器端生成token,分别保存在客户端和服务器.提交请求到达服务器,服 ...

  7. AOP+自定义注解token令牌和参数防重复提交实战

    目录 一.哪些因素会引起重复提交? 二.重复提交会带来哪些问题? 三.订单的防重复提交你能想到几种方案? 四.自定义注解方式 4.1Java核心知识-自定义注解(先了解下什么是自定义注解) 4.1.1 ...

  8. 如何处理java接口防重提交

    1.什么是接口防重? 在一定的时间内多次请求同一接口,同一参数.由于请求是 健康请求 ,会执行 正常的业务逻辑 ,从而产生大量的废数据. 2.问题的产生及引发的问题 举一个最简单的例子:日常开发中cr ...

  9. redis+aop防重复提交

    文章目录 1.防重复提交注解 2.redis分布式锁 3.防止重复提交Aop 之前有记录一篇用redis+拦截器防重复提交的内容: redis+拦截器防重复提交 1.防重复提交注解 @Target(E ...

最新文章

  1. BCH:“变法”是以史为鉴
  2. 关于常见的底层驱动源码资料
  3. 重学hadoop技术
  4. c:#ifndef, #define, #endif 作用
  5. MySQL无法远程连接解决方案
  6. pythongui界面实例_wxPython:python首选的GUI库实例分享(5)
  7. 深度学习7-常用损失函数和自定义损失函数
  8. 深入理解jvm 读后感
  9. checkinput php,使用php检查输入字段的类型
  10. NumPy库常见操作总结
  11. 数学期望方差 expectationvariance
  12. 【论文笔记-01】Re-ranking Person Re-identification with k-reciprocal Encoding
  13. linux服务上实现web在线编辑,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 | Linux 中国...
  14. 实时报价查询系统C++编程实现(阿里面试题改编)
  15. 【Liunx_QT触摸屏不管用】
  16. python使用Canny算法和HoughCiecle算法实现圆的检测与定位
  17. 计算机应用素描色彩,美术统考素描、色彩、速写考场技巧全攻略
  18. vue源码分析系列一:new Vue的初始化过程
  19. zoj 1107 FatMouse and Cheese 逆向动态规划
  20. vue2 mixins混入

热门文章

  1. 计算机主机 滴滴响,为什么电脑一开机就滴滴响?
  2. 继承、多态、重载和重写
  3. win10关闭快速启动_总说win7最好用,不知这些强大的功能,怎知你的win10好不好用?...
  4. 有道云笔记的坑爹点 和 解决办法(大概是吧)
  5. 全球最具创新公司TOP10
  6. 巴菲特经常向年轻人讲述的一个关于精灵的寓言--《The Snow Ball》
  7. Tomcat快速入门(Tomcat安装 把一个项目发布到tomcat中 Eclipse配置Tomcat idea配置tomcat)
  8. 树上的小兔子,藏了服务的新逻辑
  9. 如何在BW中做账龄的动态显示
  10. C++ Excel表格解析(一、MFC工程中的应用)