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注解防止重复提交内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot中多环境配置和@Profile注解示例详解
这篇文章主要介绍了SpringBoot中多环境配置和@Profile注解,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-01-01SpringBoot + validation 接口参数校验的思路详解
这篇文章主要介绍了SpringBoot + validation 接口参数校验,本文通过项目实践+场景分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10使用SpringBoot 配置Oracle和H2双数据源及问题
这篇文章主要介绍了使用SpringBoot 配置Oracle和H2双数据源及问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11Spring Cloud Gateway 内存溢出的解决方案
这篇文章主要介绍了Spring Cloud Gateway 内存溢出的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
最新评论