共计 2025 个字符,预计需要花费 6 分钟才能阅读完成。
登录和 cookie 缓存
对于用来登录的 cookie,有两种常见的方法可以将登录信息存储在 cookie 里面:一种是签名(signed)cookie,另一种是令牌(token)cookie。
签名 cookie 通常会存储用户名,可能还有用户 ID、用户最后一次成功登陆的时间,以及网站觉得有用的其他任何信息。除了用户的相关信息外,签名 cookie 还包含一个签名,服务器可以使用这个签名来验证发送的信息是否未经改动(比如将 cookie 中的登录用户名改成另一个客户)。
令牌 cookie 会在 cookie 里面存储一串随机字节作为令牌,服务器可以根据令牌在数据库中查找令牌的拥有者。下表展示了签名 cookie 和令牌 cookie 的优点与缺点。
签名 cookie
验证 cookie 所需的一切信息都存储在 cookie 里面。cookie 可以包含额外的信息(additional information),并且对这些信息进行签名也很容易
正确地处理签名很难。很容易忘记对数据进行签名,或者忘记验证数据的签名,从而造成安全漏洞
令牌 cookie
添加信息非常容易。cookie 的体积非常小,因此移动端和速度较慢的客户端可以更快地发送请求
需要在服务器中存储更多信息。如果使用的是关系数据库,那么载入和存储 cookie 的代价可能会更高
import java.util.Set;
import redis.clients.jedis.Jedis;
public class Login {
public String checkToken(Jedis conn,String token){
return conn.hget(“login:”, token);
public void updateToken(Jedis conn,String token,String user,String item){
long time=System.currentTimeMillis()/1000;
conn.hset(“login:”, token, user);// 维持令牌与用户之间的映射
conn.zadd(“recent:”, time, token);// 保存令牌最后一次出现的时间
if(item!=null){
conn.zadd(“viewd:”+token, time, item);// 根据这个令牌来设置该用户在这个时间戳访问的商品名字
conn.zremrangeByRank(“viewd:”+token, 0, -26);// 移除就的用户记录,只保留用户浏览过的 25 个商品。
conn.zincrby(“viewd:”, -1, item);
public class CleanSessionsThread extends Thread{
private Jedis conn;
private int limit;
private boolean quit;
public CleanSessionsThread(int limit) {
// TODO Auto-generated constructor stub
this.conn=new Jedis(“localhost”);
conn.select(15);
this.limit=limit;
public void quit(){
quit=true;
@Override
public void run() {
// TODO Auto-generated method stub
while(!quit){
long size=conn.zcard(“recent:”);// 依据登录时间确定在线人数
if(size =limit){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}else{
long endIndex=Math.min(size-limit,100);
Set String tokensSet=conn.zrange(“recent:”, 0, endIndex-1);
String[] tokens=tokensSet.toArray(new String[tokensSet.size()]);
ArrayList String sessionKeys=new ArrayList ();
for(String token:tokens){
sessionKeys.add(“viewd:”+token);
conn.del(sessionKeys.toArray(new String[sessionKeys.size()]));
conn.hdel(“login:”, tokens);
conn.zrem(“recent:”, tokens);
}
以上这篇使用 redis 管理用户登录会话的方法就是丸趣 TV 小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持丸趣 TV。
向 AI 问一下细节
丸趣 TV 网 – 提供最优质的资源集合!