springboot防重复提交

这篇具有很好参考价值的文章主要介绍了springboot防重复提交。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、场景

网页卡顿的时候,用户点击会造成重复操作

如果前端不做防重复操作。会导致重复提交,重复下单等意外操作。而且对于系统资源来说也是一种浪费

常规的解决方法是让前端把点击后的按钮设置为不可点击,这样基本上能就能解决了。99.999999%能解决。前端这么弄过后,就没有遇到过需要后端弄的了。

为了万无一失,剩下的不能解决的就需要后端做防重复点击的操作了。

2、解决方案

2.1、前端通过js让按钮点击后失效,基本上就够了。除非别人要搞你网站,直接扒你接口,放心,你的网站没有那么有价值。
2.2、数据库增加唯一索引,不建议改数据库,虽然方便。
2.3、利用令牌防止表单重复提交

表单页面初始化时,会从后端获取一个生成一个token,这个token放在表单隐藏,当表单提交时一起提交,提交后后端使该token失效;

后端判断前端提交的token为空或者失效则表单提交失败(发送token,验证token)这里需要前后端配合

2.4、使用Spring AOP自定义切入实现,作为后端,倾向于这种方式。

一般接口提交时会有token验证,表明该请求是合法一个用户。后端可以通过 用户token+类+方法来判断是否是重复请求。

RepeatSubmitTestController 文件

@RestController
@RequestMapping(path = "/repeatSubmitTest", produces = "application/json;charset=UTF-8")
public class RepeatSubmitTestController{

    @GetMapping("/listPage")
    @RepeatSubmit(timeout = 20000)
    @ApiOperation(value = "条件查询列表分页", notes = "条件查询列表分页")
    public ResponseBean listPage(@RequestParam Map<String, Object> params, HttpServletRequest request) throws MyException {
        return new ResponseBean(Constants.CODE_SUCCESS, "操作成功", "");
    }

}

RepeatSubmit 文件

// @Target 表示该注解用于什么地方
//        ElementType.CONSTRUCTOR 用在构造器
//        ElementType.FIELD 用于描述域-属性上
//        ElementType.METHOD 用在方法上
//        ElementType.TYPE 用在类或接口上
//        ElementType.PACKAGE 用于描述包
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})

//@Retention 表示在什么级别保存该注解信息
//        RetentionPolicy.SOURCE 保留到源码上
//        RetentionPolicy.CLASS 保留到字节码上
//        RetentionPolicy.RUNTIME 保留到虚拟机运行时(最多,可通过反射获取)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatSubmit {

    /**
     * 默认的间隔时间(ms),小于此时间视为重复提交
     */
    int timeout() default 2000;

}

RepeatSubmitAspect 文件文章来源地址https://www.toymoban.com/news/detail-492143.html

// 开启日志,需要依赖lombok
@Slf4j
// 把一个类定义为切面供容器读取
@Aspect
@Component
public class RepeatSubmitAspect {

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    // 这是一个环绕通知,它会围绕被 @RepeatSubmit 注解标记的方法执行,这里的 repeatSubmit 与下面的参数对应
    @Around("@annotation(repeatSubmit)")
    public Object around(ProceedingJoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {

        // 获取用户的token验证,这里项目用的是 header 里的  Authorization 参数
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String requestToken = request.getHeader("Authorization");

        // 获取注解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();

        // 获取类,方法
        String className = method.getDeclaringClass().getName();
        String methodName = method.getName();

        // 组装key:用户唯一标识+操作类+方法
        String key = requestToken + "#" + className + "#" + methodName;
        String keyHashCode = String.valueOf(Math.abs(key.hashCode()));
        log.info("key:{},keyHashcode:{}", key, keyHashCode);

        //获取超时时间
        int timeOut = repeatSubmit.timeout();
        log.info("超时时间{}", timeOut);

        //  从缓存给中根据key获取数据
        String value = redisTemplate.opsForValue().get(keyHashCode);

        if (value != null) {
            log.info("重复提交");
            // 如果value不为空; return  "请勿重复提交";
            return new ResponseBean(Constants.CODE_SUCCESS, "重复提交,稍后重试", "");

        } else {
            log.info("首次提交");
            // value为空,则加入缓存,并设置过期过期时间
            redisTemplate.opsForValue().set(keyHashCode, "1", timeOut, TimeUnit.MILLISECONDS);
        }

        //执行Object
        Object object = point.proceed();

        return object;
    }
}

到了这里,关于springboot防重复提交的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot实现后端防重复提交(AOP+redis分布式锁)单机情况下

    为什么要实现这个功能呢,可能用户在提交一份数据后,可能因为网络的原因、处理数据的速度慢等原因导致页面没有及时将用户刚提交数据的后台处理结果展示给用户,这时用户可能会进行如下操作: 1秒内连续点击提交按钮,导致重复提交表单。 使用浏览器后退按钮重复之

    2024年02月08日
    浏览(42)
  • SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

    本文为千锋教育技术团独家创作,更多技术类知识干货,点个关注持续追更~ 接口幂等性是Web开发中非常重要的一个概念,它可以保证多次调用同一个接口不会对结果产生影响。如果你想了解更多关于接口幂等性的知识,那么本文就是一个不错的起点。 在Web开发中,我们经常

    2024年02月03日
    浏览(54)
  • SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交

    SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数): SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)_redis防刷_霸道流氓气质的博客-CSDN博客 以下接口幂等性的实现方式与上面博客类似,可参考。 什么是幂等性? 幂等

    2024年02月15日
    浏览(51)
  • Win10电脑鼠标移动的时候会突然卡顿解决方法

    Win10电脑鼠标移动的时候会突然卡顿解决方法分享。有用户在使用电脑的时候,发现鼠标移动的时候,总是会突然出现卡顿的情况,导致自己的操作受到影响。那么这个情况要怎么去进行修复呢?接下来我们一起来看看以下的解决方法吧。 解决方法 1、按下快捷键“win+r”打开

    2024年02月12日
    浏览(51)
  • 使用git时候提交时候发生冲突,你能解释冲突如何产生,你是如何解决的

    Git冲突情况举例: 简单来说就是本地修改的文件和目标远程库的同一个文件都有修改。这时无论是pull/push/merge时都会产生冲突。 1、不同分支下的merge 比如在不同分支下进行分支合并时,我们在本地修改了a文件并把a文件的修改push到了test分支下,接着我们切换到master分支下将

    2024年02月08日
    浏览(53)
  • 前端如何防止接口重复提交

    接口重复提交指的是在网络通信中,同一个请求被客户端多次发送到服务器端的情况。这种情况可能由于多种原因导致,例如用户在等待期间多次点击提交按钮、网络超时后客户端重新发送请求、客户端发送的请求在网络传输过程中出现重复等。 接口重复提交可能会导致多种

    2024年04月22日
    浏览(34)
  • 防止重复提交请求

    前景提要: ts 简易封装 axios,统一 API 实现在 config 中配置开关拦截器 axios 实现请求 loading 效果 用一个数组保存当前请求的 url,此时还未响应。如果再次发起同样请求,比对 url 发现已经存在数组中,则拦截请求,提示重复提交。当该请求响应结束后,就将 url 从数组中剔除

    2024年02月06日
    浏览(38)
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案

    最近,我在使用CSDN插件浏览 MOOC 网站时,遇到了一些网络故障。具体表现为: 点击CSDN插件首页的 MOOC(中国大学慕课)图标时,网页加载缓慢且资源加载不完全,导致 网页显示不全或无法正常使用 。 在已登录并保存了Cookie的情况下,个人课程页面一直处于白屏加载状态,

    2024年02月04日
    浏览(49)
  • 微信小程序防止重复提交

    微信小程序在真机测试时,遇到这样一种情况:当网络条件差或卡顿的情况下,进行某项操作时,使用者会认为点击无效而进行多次点击,致使多次跳转页面或多次上传同一表单,导致函数或接口被多次调用,实际上使用者只想调用函数和接口一次。 添加节流阀,即按下按钮

    2024年02月13日
    浏览(47)
  • java防止重复提交的方法

      为了防止重复提交,可以采用以下几种方法: 1. 令牌机制(Token) 在表单中添加一个隐藏字段,用于存放一个随机生成的令牌(Token)。当用户提交表单时,将令牌一起提交到服务器。服务器接收到请求后,首先检查令牌是否存在,如果不存在则拒绝请求;如果存在,则将

    2024年02月01日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包