您好,登錄后才能下訂單哦!
登錄和cookie緩存
對(duì)于用來(lái)登錄的cookie,有兩種常見(jiàn)的方法可以將登錄信息存儲(chǔ)在cookie里面:一種是簽名(signed)cookie,另一種是令牌(token)cookie。
簽名cookie通常會(huì)存儲(chǔ)用戶(hù)名,可能還有用戶(hù)ID、用戶(hù)最后一次成功登陸的時(shí)間,以及網(wǎng)站覺(jué)得有用的其他任何信息。除了用戶(hù)的相關(guān)信息外,簽名cookie還包含一個(gè)簽名,服務(wù)器可以使用這個(gè)簽名來(lái)驗(yàn)證發(fā)送的信息是否未經(jīng)改動(dòng)(比如將cookie中的登錄用戶(hù)名改成另一個(gè)客戶(hù))。
令牌cookie會(huì)在cookie里面存儲(chǔ)一串隨機(jī)字節(jié)作為令牌,服務(wù)器可以根據(jù)令牌在數(shù)據(jù)庫(kù)中查找令牌的擁有者。下表展示了簽名cookie和令牌cookie的優(yōu)點(diǎn)與缺點(diǎn)。
cookie類(lèi)型 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|
簽名cookie | 驗(yàn)證cookie所需的一切信息都存儲(chǔ)在cookie里面。cookie可以包含額外的信息(additional information),并且對(duì)這些信息進(jìn)行簽名也很容易 | 正確地處理簽名很難。很容易忘記對(duì)數(shù)據(jù)進(jìn)行簽名,或者忘記驗(yàn)證數(shù)據(jù)的簽名,從而造成安全漏洞 |
令牌cookie | 添加信息非常容易。cookie的體積非常小,因此移動(dòng)端和速度較慢的客戶(hù)端可以更快地發(fā)送請(qǐng)求 | 需要在服務(wù)器中存儲(chǔ)更多信息。如果使用的是關(guān)系數(shù)據(jù)庫(kù),那么載入和存儲(chǔ)cookie的代價(jià)可能會(huì)更高 |
下面是用java寫(xiě)的一個(gè)例子
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);//維持令牌與用戶(hù)之間的映射 conn.zadd("recent:", time, token);//保存令牌最后一次出現(xiàn)的時(shí)間 if(item!=null){ conn.zadd("viewd:"+token, time, item);//根據(jù)這個(gè)令牌來(lái)設(shè)置該用戶(hù)在這個(gè)時(shí)間戳訪(fǎng)問(wèn)的商品名字 conn.zremrangeByRank("viewd:"+token, 0, -26);//移除就的用戶(hù)記錄,只保留用戶(hù)瀏覽過(guò)的25個(gè)商品。 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:");//依據(jù)登錄時(shí)間確定在線(xiàn)人數(shù) 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管理用戶(hù)登錄會(huì)話(huà)的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。