另一方面,为了防止用户因为长时间不输入密码而导致遗忘密码,并且为了保证令牌的安全性,网站一般都会为令牌设置一个过期期限(比如一个月),当期限到达之后,用户的会话就会过时,而网站则会要求用户重新登录。

    上面描述的这种使用令牌来避免重复登录的机制一般被称为登录会话(login session),通过使用 Redis 的散列,我们可以构建出代码清单 3-4 所示的登录会话程序。


    代码清单 3-4 使用散列实现的登录会话程序:


    在此之后,每当客户端向服务器发送请求并提交令牌的时候,程序就会使用 validate() 方法验证被提交令牌的正确性: 方法会根据用户的 ID ,从两个散列里面分别取出用户的会话令牌以及会话的过期时间戳,然后通过一系列检查判断令牌是否正确以及会话是否过期。

    最后,destroy() 方法可以在用户手动登出(logout)时调用,它可以删除用户的会话令牌以及会话的过期时间戳,让用户重新回到未登录状态。

    在拥有 程序之后,我们可以通过执行以下代码,为用户 peter 创建出相应的会话令牌:

    然后在会话使用完毕之后,通过执行以下代码来销毁会话:

    图 3-16 展示了使用 LoginSession 程序在数据库里面创建多个会话时的样子。


    图 3-16 登录会话程序数据结构示意图