一种解决方法是使用哈希表来存储令牌和其到期时间的映射关系,并使用定时器来定期清理过期的令牌。以下是一个示例的代码实现:
import time
# 哈希表用于存储令牌和其到期时间的映射关系
token_map = {}
# 添加令牌及其到期时间
def add_token(token, expire_time):
token_map[token] = expire_time
# 检查令牌是否有效
def is_token_valid(token):
# 检查令牌是否存在
if token not in token_map:
return False
# 检查令牌是否已过期
if token_map[token] < time.time():
# 令牌已过期,删除令牌并返回False
del token_map[token]
return False
return True
# 定时清理过期的令牌
def cleanup_expired_tokens():
current_time = time.time()
expired_tokens = []
# 找出所有过期的令牌
for token, expire_time in token_map.items():
if expire_time < current_time:
expired_tokens.append(token)
# 删除过期的令牌
for token in expired_tokens:
del token_map[token]
# 测试代码
add_token("token1", time.time() + 60) # 添加一个有效期为60秒的令牌
add_token("token2", time.time() + 120) # 添加一个有效期为120秒的令牌
print(is_token_valid("token1")) # 输出:True
print(is_token_valid("token2")) # 输出:True
time.sleep(70) # 等待70秒,使第一个令牌过期
print(is_token_valid("token1")) # 输出:False
print(is_token_valid("token2")) # 输出:True
cleanup_expired_tokens() # 清理过期令牌
print(is_token_valid("token1")) # 输出:False
print(is_token_valid("token2")) # 输出:True,因为第二个令牌还未过期
上述代码使用一个全局的哈希表 token_map
来存储令牌和其到期时间的映射关系。add_token()
函数用于添加令牌及其到期时间到 token_map
中。is_token_valid()
函数用于检查令牌是否有效,它首先检查令牌是否存在于 token_map
中,然后再检查令牌是否已过期。cleanup_expired_tokens()
函数用于定期清理过期的令牌,它会遍历 token_map
中的所有令牌,将过期的令牌从 token_map
中删除。
在测试代码部分,首先添加了两个令牌,并输出它们的有效性。然后等待第一个令牌过期,并再次输出两个令牌的有效性。最后调用 cleanup_expired_tokens()
函数清理过期令牌,并再次输出两个令牌的有效性。