SpringBoot 2.x轻松搞定重复提交

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交….

利用 自定义注解、Spring Aop、Guava Cache 实现表单防重复提交(不适用于分布式哦,后面会讲分布式方式...)

废话不多说,直接上代码:

导入依赖

在 pom.xml 中添加上 spring-boot-starter-web 的依赖即可

SpringBoot 2.x轻松搞定重复提交_第1张图片

 

Lock 注解

创建一个 LocalLock 注解,简单点就一个 key 可以了,由于暂时未用到 redis 所以 expire 是摆设….

SpringBoot 2.x轻松搞定重复提交_第2张图片

 

Lock 拦截器(AOP)

首先通过 CacheBuilder.newBuilder() 构建出缓存对象,设置好过期时间;其目的就是为了防止因程序崩溃锁得不到释放(当然如果单机这种方式程序都炸了,锁早没了;但这不妨碍我们写好点)

在具体的 interceptor() 方法上采用的是 Around(环绕增强) ,所有带 LocalLock 注解的都将被切面处理;

如果想更为灵活,key 的生成规则可以定义成接口形式(可以参考:org.springframework.cache.interceptor.KeyGenerator),这里就偷个懒了;

本章先基于 本地缓存来做,后续讲解 redis 方案

SpringBoot 2.x轻松搞定重复提交_第3张图片

 

控制层

在接口上添加 @LocalLock(key = "book:arg[0]");意味着会将 arg[0] 替换成第一个参数的值,生成后的新 key 将被缓存起来;

SpringBoot 2.x轻松搞定重复提交_第4张图片

 

主函数

SpringBoot 2.x轻松搞定重复提交_第5张图片

 

第一次请求

SpringBoot 2.x轻松搞定重复提交_第6张图片

 

第二次请求

SpringBoot 2.x轻松搞定重复提交_第7张图片

 

喜欢的小伙伴,请点个关注吧

你可能感兴趣的:(SpringBoot 2.x轻松搞定重复提交)