使用redis管理用户登录会话的方法
登录和cookie缓存
对于用来登录的cookie,有两种常见的方法可以将登录信息存储在cookie里面:一种是签名(signed)cookie,另一种是令牌(token)cookie。
签名cookie通常会存储用户名,可能还有用户ID、用户最后一次成功登陆的时间,以及网站觉得有用的其他任何信息。除了用户的相关信息外,签名cookie还包含一个签名,服务器可以使用这个签名来验证发送的信息是否未经改动(比如将cookie中的登录用户名改成另一个客户)。
令牌cookie会在cookie里面存储一串随机字节作为令牌,服务器可以根据令牌在数据库中查找令牌的拥有者。下表展示了签名cookie和令牌cookie的优点与缺点。
cookie类型 |
---|
签名cookie |
令牌cookie |
下面是用java写的一个例子
importjava.util.ArrayList; importjava.util.Set; importredis.clients.jedis.Jedis; publicclassLogin{ publicStringcheckToken(Jedisconn,Stringtoken){ returnconn.hget("login:",token); } publicvoidupdateToken(Jedisconn,Stringtoken,Stringuser,Stringitem){ longtime=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); } } publicclassCleanSessionsThreadextendsThread{ privateJedisconn; privateintlimit; privatebooleanquit; publicCleanSessionsThread(intlimit){ //TODOAuto-generatedconstructorstub this.conn=newJedis("localhost"); conn.select(15); this.limit=limit; } publicvoidquit(){ quit=true; } @Override publicvoidrun(){ //TODOAuto-generatedmethodstub while(!quit){ longsize=conn.zcard("recent:");//依据登录时间确定在线人数 if(size<=limit){ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }else{ longendIndex=Math.min(size-limit,100); SettokensSet=conn.zrange("recent:",0,endIndex-1); String[]tokens=tokensSet.toArray(newString[tokensSet.size()]); ArrayList sessionKeys=newArrayList<>(); for(Stringtoken:tokens){ sessionKeys.add("viewd:"+token); } conn.del(sessionKeys.toArray(newString[sessionKeys.size()])); conn.hdel("login:",tokens); conn.zrem("recent:",tokens); } } } } }
以上这篇使用redis管理用户登录会话的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。