springboot和vue使用时网络卡导致请求并发提交

数据请求做了去重处理,但是无法处理重复并发请求

实现代码

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

<!--处理表单重复提交--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.1-jre</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>package com.shiniukeji.myatatinterface;/*** Create With IDEA** @author:cherry* @date:2019/8/9* @time:18:00*/
/*** 自定义一个注解,给需要防止重复提交的方法加上该注解*/
public @interface RepeatSubmit {
}package com.shiniukeji.myatatinterface;import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.shiniukeji.model.ErrCode;
import com.shiniukeji.model.ResponseResult;
import com.shiniukeji.model.User;
import com.shiniukeji.web.UserController;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
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.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Configuration;import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;/*** Create With IDEA** @author:cherry* @date:2019/8/9* @time:18:00*/
@Aspect
@Configuration
public class SubmitAspect {private final Cache<String, Object> CACHES = CacheBuilder.newBuilder()// 最大缓存 100 个.maximumSize(100)// 设置缓存过期时间为S.expireAfterWrite(3, TimeUnit.SECONDS).build();@Pointcut("@annotation(com.shiniukeji.myatatinterface.RepeatSubmit)")public void pointCut() {}@Around("pointCut()")public Object interceptor(ProceedingJoinPoint pjp) {User user = (User) SecurityUtils.getSubject().getSession().getAttribute(UserController.USER_SESSION_KEY);if (user == null) {return new ResponseResult(ErrCode.ERR_CODE_FAILED,ErrCode.RESULT_FAILED,ErrCode.ERR_TOKEN_OUTTIME);}MethodSignature signature = (MethodSignature) pjp.getSignature();Method method = signature.getMethod();RepeatSubmit form = method.getAnnotation(RepeatSubmit.class);String key = getCacheKey(user.getId()+"", method, pjp.getArgs());if (!StringUtils.isEmpty(key)) {if (CACHES.getIfPresent(key) == null) {// 如果是第一次请求,就将key存入缓存中CACHES.put(key, key);} else {ResponseResult resultResponse = new ResponseResult();resultResponse.setResult(null);resultResponse.setMessage("请勿重复请求");resultResponse.setCode(ErrCode.ERR_CODE_FAILED);return resultResponse;}}try {return pjp.proceed();} catch (Throwable throwable) {throw new RuntimeException("服务器异常");}}/*** 加上用户的唯一标识*/private String getCacheKey(String uid, Method method, Object[] args) {return uid + "/" + method.getName();}
}

springboot防止表单重复提交相关推荐

  1. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  2. springboot 订单重复提交_防止表单重复提交(springboot,redis)

    我们在web项目中经常需要在后台对用户提交的表单进行校验防止重复提交.下面通过springboot的aop.redis来解决表单重复提交的问题. 通过在controller加上CheckSubmitF ...

  3. 七、SpringBoot——用户登录Demo(国际化、表单重复提交,登录拦截器)

    一.CURD的Demo 1开发前准备工作 新建一个SpringBoot工程 引入starter-web maven依赖 引入html页面和assert文件夹里的样式文件等等 2 实现访问登录页面 方式 ...

  4. 开发期间模板引擎页面修改以后,要实时生效 || 登陆成功,防止表单重复提交,可以重定向||只有登录之后才能访问相关的页面

    去除模板引擎的缓存 th:if  优先级高于  th:text 登陆成功,防止表单重复提交,可以重定向到主页 只有登录之后才能访问相关的页面 login.html <!DOCTYPE html& ...

  5. SpringMVC中实现的token,防表单重复提交

    一:首先创建一个token处理类  ,这里的类名叫 TokenHandler private static Logger logger = Logger.getLogger(TokenHandler. ...

  6. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  7. python表单防重复提交_防止表单重复提交的几种策略

    表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...

  8. 表单重复提交的解决方法

    表单重复提交的解决方法 参考文章: (1)表单重复提交的解决方法 (2)https://www.cnblogs.com/lwj-0923/p/7367517.html 备忘一下.

  9. 如何避免表单重复提交

    客户端方案 禁掉提交按钮. 表单提交后使用Javascript使提交按钮disable.这种方法防止心急的用户多次点击按钮.但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了. 使 ...

最新文章

  1. android 桌面提醒功能,安卓手机桌面上使用的工作提醒软件选择哪个?
  2. 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)
  3. 以其他控制器为目标 在视图中生成输出URL
  4. mysql config.path_mysql之 mysql_config_editor/login-path 登录密码保护
  5. 安卓手机鸿蒙系统怎么下载,华为鸿蒙系统来了:安卓系统会成为下一个“塞班”吗?...
  6. python列表推导式生成随机数_Python:列表推导式/生成器推导式
  7. RestEasy传值方式
  8. 简述hdfs工作原理_HDFS原理概念扫盲
  9. MATLAB代码美化器
  10. android 后台数据获取,android post方式给后台服务器传递数据
  11. android studio moudel,Android Studio中的Module是指什么?
  12. sql小数转换为百分数_这么齐全的数学单位换算表?寒假赶紧存下为孩子考试助力!...
  13. matlab 三维立体图,利用matlab将三维数据画成三维立体图
  14. libhv教程11--创建一个简单的HTTP客户端
  15. 学习Unity3D之探照灯效果和相机跟随。
  16. 2018-2019年世界经济危机是中国崛起最大的机遇!
  17. springboot+vue网上书城书店销售商城系统
  18. 0318复利计算器4.0
  19. 一阶常微分方程的数值解法(二阶显式、隐式 Adams 公式及 Milne 方法)
  20. mysql时间格式化到小时_mysql 时间格式化

热门文章

  1. 彻底清除SMSS.EXE病毒
  2. IDEA中对Git的常规操作(合并,提交,新建分支,更新)
  3. easyui datagrid th标签列数字保留2位小数
  4. python中的self理解
  5. Js实现Base64编码、解码
  6. python:文档转换(只支持Windows操作系统)
  7. 小波变换 python MITBIH数据库 基线漂移去噪
  8. 【读书推荐】中国是部金融史
  9. c语言规定 程序中各函数之间().,C语言基础笔试题
  10. 7-24 到底是不是太胖了 (10分)