Python 官方文档:入门教程 => 点击学习
Redis 接口防重 技术点:redis/aop 说明: 简易版本实现防止重复提交,适用范围为所有接口适用,采用注解方式,在需要防重的接口上使用注解,可以设置防重时效。 场景:
技术点:redis/aop
说明:
简易版本实现防止重复提交,适用范围为所有接口适用,采用注解方式,在需要防重的接口上使用注解,可以设置防重时效。
场景:
在系统中,经常会有一些接口会莫名其妙的被调用两次,可能在幂等接口中不会存在太大的问题,但是非幂等接口的处理就会导致出现脏数据,甚至影响系统的正确性。
选型参考:
前端处理分为:
后端处理分为:
选型原因
以上内容都是瞎BB的,其实我也是个菜鸟,欢迎各位大佬提建议或者意见,大家共同进步,共同完善,让java圈充满激情四射的爱。
@PostMapping("/user/update")
@apiOperation(value = "修改用户信息", notes = "修改用户信息", tags = "user module")
@AvoidReSubmit(expireTime = 1000 * 3)
public void update(@RequestBody User user){
userMapper.updateById(user);
}
// 定义自定义注解,设置注解参数默认值
package top.withu.gaof.freehope.annotate;
import java.lang.annotation.*;
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AvoidReSubmit {
long expireTime() default 30 * 1000L;
}
// 定义切面进行处理
package top.withu.gaof.freehope.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import top.withu.gaof.freehope.annotate.AvoidReSubmit;
import javax.annotation.Resource;
import java.security.MessageDigest;
import java.security.NoSuchAlGorithmException;
import java.util.concurrent.TimeUnit;
@Aspect
@Component
public class AvoidResumitAspect {
@Resource
private RedisTemplate redisTemplate;
@Pointcut(value = "@annotation(top.withu.gaof.freehope.annotate.AvoidReSubmit)")
public void submit() {
}
@Before("submit()&&@annotation(avoidReSubmit)")
public void doBefore(JoinPoint joinPoint, AvoidReSubmit avoidReSubmit) {
// 拼装参数
StringBuffer sb = new StringBuffer();
for(Object object : joinPoint.getArgs()){
sb.append(object);
}
String key = md5(sb.toString());
long expireTime = avoidReSubmit.expireTime();
ValueOperations valueOperations = redisTemplate.opsForValue();
Object object = valueOperations.get(key);
if(null != object){
throw new RuntimeException("您已经提交了请求,请不要重复提交哦!");
}
valueOperations.set(key, 1, expireTime, TimeUnit.MILLISECONDS);
}
@Around("submit()&&@annotation(avoidReSubmit)")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint, AvoidReSubmit avoidReSubmit) throws Throwable {
System.out.println("环绕通知:");
Object result = null;
result = proceedingJoinPoint.proceed();
return result;
}
@After("submit()")
public void doAfter() {
System.out.println("******拦截后的逻辑******");
}
private String md5(String str){
if (str == null || str.length() == 0) {
throw new IllegalArgumentException("String to encript cannot be null or zero length");
}
StringBuffer hexString = new StringBuffer();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
byte[] hash = md.digest();
for (int i = 0; i < hash.length; i++) {
if ((0xff & hash[i]) < 0x10) {
hexString.append("0" + Integer.toHexString((0xFF & hash[i])));
} else {
hexString.append(Integer.toHexString(0xFF & hash[i]));
}
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return hexString.toString();
}
}
思路:
简单的通过redis实现,估计版本在网上非常多了。这里的一个思路还是mark一下,现在我这代码只有我和上帝知道什么意思,我怕一个月以后就只有上帝知道了。
到此这篇关于Java结合redis实现接口防重复提交的文章就介绍到这了,更多相关redis 接口防重复提交内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java结合redis实现接口防重复提交
本文链接: https://lsjlt.com/news/136266.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0