package com.webmanage.service.impl; import com.webmanage.service.TokenService; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.UUID; import java.util.concurrent.TimeUnit; @Service public class TokenServiceImpl implements TokenService { private static final String IDEMPOTENCY_TOKEN_PREFIX = "idempotency:token:"; private static final long DEFAULT_EXPIRE_SECONDS = 60 * 5; // 5分钟 @Resource private RedisTemplate redisTemplate; @Override public String generateToken(Long userId) { String token = UUID.randomUUID().toString().replace("-", ""); String key = IDEMPOTENCY_TOKEN_PREFIX + token; // 值不重要,设置一个标记即可 redisTemplate.opsForValue().set(key, userId == null ? 0L : userId, DEFAULT_EXPIRE_SECONDS, TimeUnit.SECONDS); return token; } @Override public boolean verifyAndConsume(String token) { if (token == null || token.isEmpty()) { return false; } String key = IDEMPOTENCY_TOKEN_PREFIX + token; Boolean existed = redisTemplate.hasKey(key); if (Boolean.TRUE.equals(existed)) { // 消费后删除,确保一次性 redisTemplate.delete(key); return true; } return false; } }