接口幂等性是指无论调用接口的次数是一次还是多次,对于同一资源的操作都只会产生一次结果。换句话说,多次重复调用相同的接口请求应该具有与单次请求相同的效果,不会导致不一致或副作用的发生。
今天我们使用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为我们生成的一个简单的接口短时间内防止重复提交的注解代码!
相关代码在文章末尾,需要的话可以白嫖哈!
接口幂等性解决方案
下面问一下接口幂等性解决方案,

关于这个回答,大家觉得怎么样?
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
接口
+关注
关注
33文章
9662浏览量
157987 -
缓存
+关注
关注
1文章
248浏览量
27883 -
AI
+关注
关注
91文章
42722浏览量
303589 -
代码
+关注
关注
30文章
4986浏览量
74656 -
Redis
+关注
关注
0文章
397浏览量
12344
发布评论请先 登录
相关推荐
热点推荐
离线计算中的幂等和DataWorks中的相关事项
考虑到幂等性,导致对应的单据有两条确认记录。点此查看原文:http://click.aliyun.com/m/42758/概念幂等这个词在软
发表于 02-27 13:24
双接口RFID解决方案提升医疗设备实用性及使用寿命
,而这正是一个双接口RFID解决方案所擅长的领域。作为连接系统内部工作的网关,双接口RFID解决方案与监控设备相连无需纠缠不清的连接线,因此可提高监控仪的实用
发表于 05-29 06:54
HDMI接口静电保护解决方案
和发射器IC芯片采用的是亚微米CMOS工艺制造而成的,而亚微米CMOS十分地敏感,为此需要借助ESD静电保护器件和ESD静电保护解决方案为其保驾护航。机顶盒STB、电视LCD等终端应用极其容易受到ESD
发表于 12-31 15:57
在高并发下怎么保证接口的幂等性?
前言 接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场景
什么是幂等性?关于接口幂等性的解决方案
这里的乐观锁指的是用乐观锁的原理去实现,为数据字段增加一个version字段,当数据需要更新时,先去数据库里获取此时的version版本号
发表于 10-09 10:19
•2617次阅读
分析解决幂等(性)的方法
幂等这个概念,是一个数学上的概念,即:f……(f(f(x))) = f(x)。用在计算机领域,指的是系统里的接口或方法对外的一种承诺,使用相同参数对同一资源重复调用某个接口或方法的结果
Spring Boot实现接口幂等性的4种方案
幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。
一个注解,优雅的实现接口幂等性!
除了查询和删除之外,还有更新操作,同样的更新操作在大多数场景下也是天然幂等的,其例外是也会存在ABA的问题,更重要的是,比如执行update table set a = a + 1 where v = 1这样的更新就非幂等了。
为什么要实现幂等性校验 如何实现接口的幂等性校验
前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
Microchip人机接口解决方案:打造现代直观的用户界面
Microchip人机接口解决方案:打造现代直观的用户界面 在当今的电子产品设计中,用户界面的重要性日益凸显。一个现代、直观的用户界面不仅能提升产品的易用性,还能增强其功能
基于接口幂等性解决方案
评论