Redis与自定义注解实现重复方式
更新时间:2025年12月11日 14:12:59 作者:筱筱木
文章介绍了如何使用Redis和自定义注解`SubmitLock`来防止重复提交,首先,创建了一个注解`SubmitLock`,然后在需要防止重复提交的方法上使用该注解,最后,通过一个controller测试验证了该功能的有效性
1、创建 SubmitLock 注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SubmitLock {
String key() default "";
}2、注解实现
@Autowired
public RedisUtils redisUtils;
@Around("execution(* com.example.code_generation..*Controller.*(..)) && @annotation(lock)")
public Object submitInterceptor(ProceedingJoinPoint pjp, SubmitLock lock) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String uri = request.getRequestURI();
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
//真实类名字
String targetName = pjp.getTarget().getClass().getName();
//真实方式
String methodName = pjp.getSignature().getName();
//所有的请求参数
Object[] arguments = pjp.getArgs();
Object[] args = new Object[arguments.length];
SubmitLock localLock = method.getAnnotation(SubmitLock.class);
String key = setKey(localLock.key(), pjp.getArgs());
if (!StringUtils.isEmpty(key)) {
if (redisUtils.get(key) != null) {
log.error("请勿重复操作,uri = 【{}】", uri);
return new RspData<>(BizCodeEnum.WARN, "请勿重复操作");
}
redisUtils.set(key,key,2);
}
Object result = null;
try {
result = pjp.proceed();
return result;
}catch (Throwable throwable){
throw new RuntimeException("服务器异常");
}finally {
int order = 0;
for (Object arg : arguments){
if (arg instanceof ServletRequest || arg instanceof ServletResponse || arg instanceof MultipartFile){
continue;
}
args[order] = arg;
order ++ ;
}
log.info("调用Controller方法返回结果,targetName = {}, methodName = {}, args = {}, result = {}",
targetName, methodName, args, result);
}
}
private String setKey(String keyExpress, Object[] args) {
if (null != args && args.length > 0) {
keyExpress = keyExpress.replace("arg[0]", args[0].toString());
}
return keyExpress;
}
3、controller 测试验证
@SubmitLock(key = "getTest")
@ApiOperation(value = "获取代办任务")
@GetMapping("getTest")
public Object getTest(@CurrentUser UserInfo userInfo) {
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
无法启动Redis打开redis-server闪退的问题解决办法
正常开启redis服务,首先要启动redis-server.exe,但是闪退,导致无法开启redis服务,这篇文章主要给大家介绍了关于无法启动Redis打开redis-server闪退问题的解决办法,需要的朋友可以参考下2024-07-07
如何使用 redis 消息队列完成秒杀过期订单处理操作(二)
这篇文章主要介绍了如何使用 redis 消息队列完成秒杀过期订单处理操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧2024-07-07


最新评论