今天用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

责任编辑:武晓燕 来源: Java技术指北
相关推荐

2022-11-11 07:34:43

2022-11-15 07:39:48

2022-11-17 07:43:13

2022-06-10 13:03:44

接口重试while

2023-08-24 08:02:19

幂等性API请求

2021-04-28 14:31:35

Dubbo接口日志

2013-11-13 11:01:14

表单表单重复提交表单策略

2013-11-13 14:39:53

表单提交开发

2020-07-17 07:59:55

数据

2022-05-16 10:45:22

Redis接口限流缓存

2022-06-21 14:44:38

接口数据脱敏

2020-06-22 07:47:46

提交面试官订单

2023-08-01 08:54:02

接口幂等网络

2020-06-22 07:55:28

接口爬虫

2010-11-23 16:56:04

mysql表单

2022-05-25 09:55:40

数据重复提交Java

2009-06-05 10:37:52

struts2 国际化表单

2022-05-26 10:42:30

数据权限注解

2021-02-28 07:43:28

请求提交方案

2023-08-21 08:01:03

点赞
收藏

51CTO技术栈公众号