在基于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