在基于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:";@Autowiredprivate 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 {@Autowiredprivate 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