@Idempotent
时间: 2024-02-13 21:57:20 浏览: 223
@Idempotent是一个自定义注解,用于标记需要进行幂等性检查的接口。在需要进行幂等性检查的接口上添加@Idempotent注解,然后定义一个拦截器来拦截这个注解。在拦截器中,可以使用Redis等缓存工具来实现幂等性检查。如果检查到重复请求,则直接返回结果,否则执行接口逻辑。
以下是一个使用@Idempotent注解实现幂等性检查的示例代码:
```java
// 定义注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
String value() default "";
}
// 定义拦截器
@Component
public class IdempotentInterceptor implements HandlerInterceptor {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Method method = ((HandlerMethod) handler).getMethod();
Idempotent idempotent = method.getAnnotation(Idempotent.class);
if (idempotent != null) {
String key = request.getRequestURI() + ":" + request.getMethod() + ":" + request.getParameter("token");
Boolean success = redisTemplate.opsForValue().setIfAbsent(key, 1, 60, TimeUnit.SECONDS);
if (!success) {
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":400,\"msg\":\"请勿重复请求\"}");
return false;
}
}
return true;
}
}
// 在需要进行幂等性检查的接口上添加@Idempotent注解
@RestController
public class TestController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@PostMapping("/test")
@Idempotent
public String test(@RequestBody Map<String, Object> params) {
// your code here
return "success";
}
}
```
阅读全文