前言:我正在工作的产品(一堆Spring Boot应用程序)中的要求是使用JWT令牌来提高安全性,该令牌是从内部服务器获取的,并用于通过REST调用在服务之间进行通信。
问题: JWT令牌TTL精确到2个小时,因此我尝试将其放入缓存中,因此对于给定的userId
,我不应在过期之前从服务器获取新的JWT令牌。这部分有效,问题是在TTL过期时将缓存逐出。
代码如下。
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.scheduling.annotation.Scheduled;
public class JWTUtility {
// Some Fake JWT Ticket
private static final String FAKE_JWT_TICKET = "";
@Cacheable(value = "jwtToken", key = "#userId", condition = "#userId != null")
public String getToken(boolean securityEnabled, String userId) {
if (!securityEnabled) {
return FAKE_JWT_TICKET;
} else {
// Proper logic to fetch and return the JWT token from Server
// Assume this works
}
}
// JWT Ticket TTL is 2 Hrs, scheduling cache evict at 1:50 Hrs
@Scheduled(fixedRate = 6600000)
@CacheEvict(value = "jwtToken", allEntries = true)
public void evictJWTTicketValues() {
//Intentionally left blank
}
}
调度部分无法正常运行。问题是,当特定userId
的某些JWT票证进入缓存jwtToken
时,如何启动调度程序的计时器。我完全愿意接受上述JWTUtility
类的重构/重写逻辑。
@Bean
public CaffeineCache jwtTokenCache() {
return new CaffeineCache(
"jwtTokenCache",
Caffeine.newBuilder().expireAfterWrite(120, TimeUnit.MINUTES).recordStats().build());
}
您需要将方法声明为-
@Cacheable(cacheNames = "jwtTokenCache", value = "jwtToken", key = "#userId", condition = "#userId != null")