接口冪等性是指無(wú)論調(diào)用接口的次數(shù)是一次還是多次,對(duì)于同一資源的操作都只會(huì)產(chǎn)生一次結(jié)果。換句話說(shuō),多次重復(fù)調(diào)用相同的接口請(qǐng)求應(yīng)該具有與單次請(qǐng)求相同的效果,不會(huì)導(dǎo)致不一致或副作用的發(fā)生。
今天我們使用AI幫我們?nèi)?chuàng)建一個(gè)自定義 注解 ,可以防止接口30秒內(nèi)的重復(fù)請(qǐng)求,并采用Redis作為緩存。
提問(wèn)
話不多說(shuō),直接提問(wèn):
等待數(shù)分鐘后。。。
1.創(chuàng)建自定義注解 其中包括接口保護(hù)時(shí)長(zhǎng),開(kāi)啟防止重復(fù)提交保護(hù)等。
2.然后創(chuàng)建攔截器
這里我們貼出攔截器的核心代碼:
@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;
}
//創(chuàng)建redis 緩存key
private String buildKey(HttpServletRequest request) throws IOException, NoSuchAlgorithmException {
String key = useRequestMD5 ? hashRequest(request) : request.getRequestURI();
return "repeat-submit:" + key;
}
//對(duì)請(qǐng)求做hash運(yùn)算
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.注冊(cè)攔截器
最后給出的解釋與使用方法。
上面就是最關(guān)鍵的代碼了。
接入Redis
下面我們接入Redis。最精簡(jiǎn)的配置版本
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());
}
}
本地起一個(gè)Redis,然后啟動(dòng)本地的SpringBoot項(xiàng)目進(jìn)行測(cè)試,
本地接口測(cè)試:30秒內(nèi)重復(fù)請(qǐng)求會(huì)需要直接被攔截
Redis中緩存的KEY如下:
以上就是利用AI為我們生成的一個(gè)簡(jiǎn)單的接口短時(shí)間內(nèi)防止重復(fù)提交的注解代碼!
相關(guān)代碼在文章末尾,需要的話可以白嫖哈!
接口冪等性解決方案
下面問(wèn)一下接口冪等性解決方案,
關(guān)于這個(gè)回答,大家覺(jué)得怎么樣?
-
接口
+關(guān)注
關(guān)注
33文章
8615瀏覽量
151307 -
緩存
+關(guān)注
關(guān)注
1文章
240瀏覽量
26696 -
AI
+關(guān)注
關(guān)注
87文章
30998瀏覽量
269312 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68696 -
Redis
+關(guān)注
關(guān)注
0文章
376瀏覽量
10884
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論