

今天用AI搞一个防止接口重复提交注解
source link: https://www.51cto.com/article/756691.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天用AI搞一个防止接口重复提交注解
哈喽,大家好,我是了不起。
接口幂等性是指无论调用接口的次数是一次还是多次,对于同一资源的操作都只会产生一次结果。换句话说,多次重复调用相同的接口请求应该具有与单次请求相同的效果,不会导致不一致或副作用的发生。
今天我们使用AI帮我们去创建一个自定义注解,可以防止接口30秒内的重复请求,并采用Redis作为缓存。
话不多说,直接提问:

等待数分钟后。。。
1.创建自定义注解 其中包括接口保护时长,开启防止重复提交保护等。

2.然后创建拦截器

这里我们贴出拦截器的核心代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
RepeatSubmit annotation = handlerMethod.getMethodAnnotation(RepeatSubmit.class);
if (annotation != null && annotation.enable()) {
String key = buildKey(request);
if (StringUtils.hasText(redisTemplate.opsForValue().get(key))) {
response.getWriter().write("repeat request, please try again later!");
return false;
} else {
redisTemplate.opsForValue().set(key, Arrays.toString(request.getInputStream().readAllBytes()), annotation.timeout(), TimeUnit.SECONDS);
}
}
}
return true;
}
//创建redis 缓存key
private String buildKey(HttpServletRequest request) throws IOException, NoSuchAlgorithmException {
String key = useRequestMD5 ? hashRequest(request) : request.getRequestURI();
return "repeat-submit:" + key;
}
//对请求做hash运算
private String hashRequest(HttpServletRequest request) throws IOException, NoSuchAlgorithmException {
byte[] hashBytes = MessageDigest.getInstance("MD5").digest(request.getInputStream().readAllBytes());
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
3.注册拦截器

最后给出的解释与使用方法。

上面就是最关键的代码了。
接入Redis
下面我们接入Redis。最精简的配置版本:
spring:
data:
redis:
host: 127.0.0.1
port: 6379
接口使用注解
@RestController
public class RepeatTestController {
@RepeatSubmit
@GetMapping("/hello/mono1")
public Mono<String> mono(){
return Mono.just("Hello Mono - Java North");
}
@RepeatSubmit
@PostMapping ("/hello/mono1")
public Mono<String> mono1(@RequestBody User user){
return Mono.just("Hello Mono - Java North-"+user.getName());
}
}
本地起一个Redis,然后启动本地的SpringBoot项目进行测试。

本地接口测试:30秒内重复请求会需要直接被拦截

Redis中缓存的KEY如下:

以上就是利用AI为我们生成的一个简单的接口短时间内防止重复提交的注解代码!
相关代码在文章末尾,需要的话可以白嫖哈!
接口幂等性解决方案
下面问一下接口幂等性解决方案,

关于这个回答,大家觉得怎么样?
相关代码链接,欢迎来嫖:
https://github.com/javatechnorth/java-study-note/tree/master/isv-repeat-submit-spring-boot-starter
Recommend
-
189
-
69
背景 前端在向后端进行数据提交的时候,通常会需要在第一次提交返回前,阻止用户在快速点击发送二次请求,即防止重复提交,最简单的方法是使用标志参数或者 class 元素控制,但缺点是,每个控制重复提交的地方都需要加上这个逻辑,重复性太强,且控制逻辑不统一。...
-
29
有位朋友,某天突然问磊哥:在 Java 中,防止重复提交最简单的方案是什么? 这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单。 于是磊哥问他,是单机环境还是分布式环境? 得到的反馈是单机环境,那就简单...
-
6
表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:点击提交按钮两次。点击刷新按钮。使用浏览器后退按钮重复之前的操作,导致重复提交表单。...
-
7
简单的六种防止数据重复提交的方法!-51CTO.COM
-
8
最简单的六种防止数据重复提交的方法!更新日期: 2022-05-25阅读量: 112标签:
-
3
一个注解搞定SpringBoot接口定制属性加解密 - 福隆苑居士 - 博客园 上个月公司另一个团队做的新项目上线后大体上运行稳定,但包括研发负...
-
6
如何防止接口重复提交? 作者:鸭血粉丝Tang 2022-11-11 07:34:43 对于下单流量不算高的系统,可以采用这种请求唯一ID+数据表增加唯一索引约束的方式,来防止接口重复提交! 对于投入运营的软件系统,最...
-
7
聊聊如何防止接口重复提交? 作者:鸭血粉丝Tang 2022-11-17 07:43:13 本次方案相比于上一个方案,最大的改进点在于:将接口请求唯一 ID 的生成逻辑,放在服务端通过规则组合来实现,不需要前端提交接口的时候强制...
-
7
在上一篇文章中,我们详细的介绍了对于下单流量不算高的系统,可以通过请求唯一ID+数据表增加唯一索引约束这种方案来实现防止接口重复提交! 随着业务的快速增长,每一秒的下单请...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK