问题描述
1.在我们项目开发过程中会出现用户保存操作时候快速点击两次会出现一条数据在数据库保存多条数据。
2.遇见上述问题我们首先跟前端开发沟通,在前端开发过程中可以将操作按钮在操作完后就行置灰操作,虽然这样做了,但是不能从根们解决问题(前端和后端都防止,这样就可以根本解决问题),然后需要后端进行提交接口进行重复提交处理。
解决思路
1.前端利用js操作或者vue操作进行按钮置灰,防止二次点击!
2.java后端利用redis进行防止重复操作!
每次请求提交保存数据需要提前请求接口获取token,然后在提交请求将获取token放入需要提交数据的接口头部,然后将保存操作接口放入注解@ExtApiIdempotent(ConstantUtils.EXTAPIHEAD),后端会先进入aop中在头部找到token来判断redis是否存在当前redis,如果存在说明没有重复然后进行删除redis缓存数据,如果你连续点击第二次时候其实这个token已经被上一个请求给删除掉了,所以就是重复提交,不明白可以在下面评论,我都会回复
代码解释
1.在前端请求接口之前先请求获取一个token,我们java端将token生成完返给前端后,放入redis中,token作为key和token作为value 设置失效时间为200秒。
@RequestMapping("/redisToken")
public String getRedisToken() {
return token.getToken();
}
这是token工具类
package com.example.test.framework.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.UUID;
@Component
public class RedisToken {
@Autowired
private BaseRedisService baseRedisService;
@Autowired
private RedisUtil redisUtil;
/** 缓存指定时间200秒 */
private static final long TOKENTIMEOUT = 200;
/**
* 生成Token
*/
public String getToken(){
String token = UUID.randomUUID().toString();
token=token.replaceAll("-", "");
// 将token放到Redis中,用UUID保证唯一性
baseRedisService.setString(token, token, TOKENTIMEOUT);
return token;
}
public synchronized boolean findToken(String tokenKey) {
String tokenValue = (String) redisUtil.get(tokenKey);
// 如果能够获取该(从redis获取令牌)令牌(将当前令牌删除掉) 就直接执行该访问的业务逻辑
if (StringUtils.isEmpty(tokenValue)) {
return false;