考虑一个典型的秒杀场景,用户需要在秒杀开始时访问秒杀接口以获取秒杀资格,并在有效期内发起秒杀请求。我们希望在系统设计中动态生成秒杀接口地址,增加接口的安全性。
import java.util.UUID;
@RestController
public class SeckillController {
private static final String SECKILL_KEY_PREFIX = "seckill:";
private static final long SECKILL_VALIDITY_PERIOD = 60 * 5; // 5分钟有效期
@Autowired
private RedisTemplate<String, String> redisTemplate;
@PostMapping("/generateSeckillUrl")
public ResponseEntity<String> generateSeckillUrl(@RequestParam Long userId) {
// 生成唯一的令牌
String seckillToken = UUID.randomUUID().toString().replace("-", "");
// 将令牌存储到Redis中,并设置有效期
String key = SECKILL_KEY_PREFIX + seckillToken;
redisTemplate.opsForValue().set(key, userId.toString(), SECKILL_VALIDITY_PERIOD, TimeUnit.SECONDS);
// 构建带有令牌的秒杀地址
String seckillUrl = "/seckill?token=" + seckillToken;
return ResponseEntity.ok(seckillUrl);
}
// 其他秒杀接口...
}
在上述代码中,/generateSeckillUrl
接口用于生成带有令牌的秒杀地址。令牌将被存储到Redis中,有效期为5分钟。用户在秒杀开始时调用该接口,获取带有令牌的秒杀地址。
假设一个用户在秒杀开始时调用 /generateSeckillUrl
接口,获取了一个带有令牌的秒杀地址。我们期望获得的动态生成的秒杀地址类似于:
/seckill?token=fd3b7a951bc14f3e80f45cc787f4e282
为了验证系统的运行,假设用户获得了上述的秒杀地址,然后在有效期内访问 /seckill
接口,并提供正确的令牌和身份验证信息。系统应该返回 “秒杀成功!”。
若用户提供的令牌无效,或者身份验证信息不正确,系统应该返回相应的错误信息,例如 “秒杀令牌无效,请重新获取秒杀地址。” 或 “身份验证失败,无法完成秒杀。”。