| cookie類型 | 優點 | 缺點 |
|---|---|---|
| 簽名cookie | 驗證cookie所需的一切信息都存儲在cookie里面。cookie可以包含額外的信息(additional information),并且對這些信息進行簽名也很容易 | 正確地處理簽名很難。很容易忘記對數據進行簽名,或者忘記驗證數據的簽名,從而造成安全漏洞 |
| 令牌cookie | 添加信息非常容易。cookie的體積非常小,因此移動端和速度較慢的客戶端可以更快地發送請求 | 需要在服務器中存儲更多信息。如果使用的是關系數據庫,那么載入和存儲cookie的代價可能會更高 |
下面是用java寫的一個例子
import java.util.ArrayList;
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);
SetString> tokensSet=conn.zrange("recent:", 0, endIndex-1);
String[] tokens=tokensSet.toArray(new String[tokensSet.size()]);
ArrayListString> 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管理用戶登錄會話的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。