在基于Spring Boot 2和Redis实现防重令牌的幂等性控制时,你可以使用Redis存储令牌信息,并在接口请求时验证令牌的有效性。下面是一个简单的示例代码,演示了如何使用Spring Boot 2和Redis实现防重令牌的机制:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Service
public class TokenService {
private static final String REDIS_KEY_PREFIX = "api:token:";
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 生成并存储防重令牌
*
* @return 生成的令牌
*/
public String generateAndStoreToken() {
String token = generateToken();
String redisKey = REDIS_KEY_PREFIX + token;
// 将令牌存储到Redis,并设置过期时间
redisTemplate.opsForValue().set(redisKey, "", 5, TimeUnit.MINUTES);
return token;
}
/**
* 检查令牌的有效性,防止重复提交
*
* @param token 要检查的令牌
* @return true:令牌有效;false:令牌无效
*/
public boolean isTokenValid(String token) {
String redisKey = REDIS_KEY_PREFIX + token;
// 检查Redis中是否存在该令牌
return !redisTemplate.hasKey(redisKey);
}
/**
* 生成唯一的令牌
*
* @return 生成的令牌
*/
private String generateToken() {
return UUID.randomUUID().toString();
}
}
在这个例子中,TokenService
提供了两个主要方法:
generateAndStoreToken()
用于生成令牌并将其存储到Redis中,同时设置了令牌的过期时间为5分钟。isTokenValid(String token)
用于检查令牌的有效性,确保一个令牌在有效期内只能使用一次。
在你的Controller中,你可以使用TokenService
来防止接口的重复提交:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class MyController {
@Autowired
private TokenService tokenService;
@PostMapping("/submitData")
public String submitData(@RequestParam String data, @RequestParam String token) {
// 检查令牌的有效性
if (!tokenService.isTokenValid(token)) {
return "重复提交,令牌无效!";
}
// 处理业务逻辑,例如保存数据等
// 使用完令牌后,可以将其从Redis中删除,确保该令牌在有效期内只能使用一次
// 这样做是为了确保幂等性,防止同一请求多次提交
// 注意:这里删除操作是可选的,根据业务需求和实际情况考虑是否需要删除
// String redisKey = "api:token:" + token;
// redisTemplate.delete(redisKey);
return "数据提交成功!";
}
}
在这个例子中,当客户端发起一个请求时,需要携带一个令牌 token
。在Controller中,首先通过tokenService.isTokenValid(token)
检查令牌的有效性,如果有效则处理业务逻辑,然后可以选择将令牌从Redis中删除,确保同一个令牌在有效期内只能使用一次。
请注意,这只是一个简单的示例,实际应用中可能需要根据具体业务需求进行更详细的处理。
接口幂等性(防重令牌)(重复提交)_接口幂等性,防止重复提交-CSDN博客
https://blog.csdn.net/m0_55990500/article/details/127316115?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%98%B2%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%20%E4%BB%A4%E7%89%8C%E6%9C%BA%E5%88%B6&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-127316115.142v96pc_search_result_base4&spm=1018.2226.3001.4187