Java使用注解实现防止重复提交实例

 更新时间:2023年07月07日 08:28:06   作者:crazyK.  
这篇文章主要介绍了Java使用注解实现防止重复提交实例,在一些项目中由于用户误操作,多次点击表单提交按钮,会产生很多次的数据交互,为了解决这一问题,本文使用注解来实现防止重复提交,需要的朋友可以参考下

重复提交的场景:

  • 用于用户误操作,多次点击表单提交按钮
  • 由于网速等原因造成页面卡顿,用户重复刷新提交页面
  • 恶用户如利用postman等工具重复恶意提交表单

为了防止以上情况的出现需要自定义一个注解来完成防止重复提交操作

实现

1.创建一个注解

/**
 * 自定义注解防止表单重复提交
 */
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {
    int lockTime() default 5;
}

注解参数不懂的小伙伴可以移步这篇文章:java自定义注解_crazyK.的博客-CSDN博客  

2.创建Http请求工具类,用于在切面时获取token使用

public class HttpContextUtils {
    public static HttpServletRequest httpServletRequest(){
        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
    }
}

3.项目中加入SpringAop依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

4.创建切面

将切点注册为自定义的注解,唯一表示采用接口url+token的形式,户每发起第一次添加请求,会经过界面,在切面获取信息后组装起来存入Redis,当用户后续发起请求时,首先判断Redis中是否缓存了这个key,如果缓存了,则证明已经提交,于是反馈给前端,如果不存在,证明没有提交,则存入Redis。

@Component
@Aspect
public class NoRepeatSubmitAspect {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    @Pointcut("@annotation(repeatSubmit)")
    public void pointcutNoRepeat(NoRepeatSubmit repeatSubmit){};
    @Around("pointcutNoRepeat(noRepeatSubmit)")
    public Object doNoRepeat(ProceedingJoinPoint point, NoRepeatSubmit noRepeatSubmit) throws Throwable {
        int i=noRepeatSubmit.lockTime();
        HttpServletRequest httpServletRequest = HttpContextUtils.httpServletRequest();
        String token = httpServletRequest.getHeader("token");
        String url = httpServletRequest.getRequestURL().toString();
        String sign = url+"/"+token;
        Boolean key=redisTemplate.hasKey(sign);
        if (key){
            throw new Exception("请勿重复提交");
        }
        redisTemplate.opsForValue().set(sign,sign,i, TimeUnit.SECONDS);
        return  point.proceed();
    }
}

测试

将我们自定义的注解加到对应方法上

先向redis中插入一条key为crazyk,value为csdn的数据

提交成功,然后在向redis中存入相同的数据后端会抛出我们在切面自定义的异常

到此这篇关于Java使用注解实现防止重复提交实例的文章就介绍到这了,更多相关Java注解防止重复提交内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring AOP操作的相关术语及环境准备

    Spring AOP操作的相关术语及环境准备

    这篇文章主要为大家介绍了Spring AOP操作的相关术语及环境准备学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用

    Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用

    前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议
    2021-05-05
  • Java NIO和IO的区别

    Java NIO和IO的区别

    这篇文章主要介绍了Java NIO和IO的区别,需要的朋友可以参考下
    2014-06-06
  • Java查找不重复无序数组中是否存在两个数字的和为某个值

    Java查找不重复无序数组中是否存在两个数字的和为某个值

    今天小编就为大家分享一篇关于Java查找不重复无序数组中是否存在两个数字的和为某个值,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java实现人民币大小写转换方法分享

    java实现人民币大小写转换方法分享

    本文介绍java人民币数字大小写转换方法,代码中有注释,大家直接看代码吧
    2014-01-01
  • Java 泛型总结(一):基本用法与类型擦除

    Java 泛型总结(一):基本用法与类型擦除

    本文主要介绍了Java泛型的使用以及类型擦除相关的问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Mybatis配置错误:java.lang.ExceptionInInitializerError

    Mybatis配置错误:java.lang.ExceptionInInitializerError

    这篇文章主要介绍了Mybatis配置错误:java.lang.ExceptionInInitializerError的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • IDEA配置和启动maven项目详细步骤

    IDEA配置和启动maven项目详细步骤

    本文介绍了从SVN检出Web项目并进行Maven化、JDK和项目结构配置、Spring和Tomcat环境搭建的详细步骤,帮助读者顺利完成Java Web项目的开发环境搭建
    2025-10-10
  • 快速掌握SpringBoot应用的启动入口

    快速掌握SpringBoot应用的启动入口

    本篇并不是深究内置服务器的启动过程,而是追溯Springboot启动之前到底做了什么?它是如何与我们经常写的@SpringBootApplication注解注释的main方法类绑定起来的?对SpringBoot启动入口相关知识感兴趣的朋友一起看看吧
    2022-05-05
  • 为什么SpringMVC中请求的body不支持多次读取

    为什么SpringMVC中请求的body不支持多次读取

    这篇文章主要介绍了为什么SpringMVC中请求的body不支持多次读取,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论