使用redis管理用戶登錄會(huì)話的方法
登錄和cookie緩存
對于用來登錄的cookie,有兩種常見的方法可以將登錄信息存儲(chǔ)在cookie里面:一種是簽名(signed)cookie,另一種是令牌(token)cookie。
簽名cookie通常會(huì)存儲(chǔ)用戶名,可能還有用戶ID、用戶最后一次成功登陸的時(shí)間,以及網(wǎng)站覺得有用的其他任何信息。除了用戶的相關(guān)信息外,簽名cookie還包含一個(gè)簽名,服務(wù)器可以使用這個(gè)簽名來驗(yàn)證發(fā)送的信息是否未經(jīng)改動(dòng)(比如將cookie中的登錄用戶名改成另一個(gè)客戶)。
令牌cookie會(huì)在cookie里面存儲(chǔ)一串隨機(jī)字節(jié)作為令牌,服務(wù)器可以根據(jù)令牌在數(shù)據(jù)庫中查找令牌的擁有者。下表展示了簽名cookie和令牌cookie的優(yōu)點(diǎn)與缺點(diǎn)。
| cookie類型 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| 簽名cookie | 驗(yàn)證cookie所需的一切信息都存儲(chǔ)在cookie里面。cookie可以包含額外的信息(additional information),并且對這些信息進(jìn)行簽名也很容易 | 正確地處理簽名很難。很容易忘記對數(shù)據(jù)進(jìn)行簽名,或者忘記驗(yàn)證數(shù)據(jù)的簽名,從而造成安全漏洞 |
| 令牌cookie | 添加信息非常容易。cookie的體積非常小,因此移動(dòng)端和速度較慢的客戶端可以更快地發(fā)送請求 | 需要在服務(wù)器中存儲(chǔ)更多信息。如果使用的是關(guān)系數(shù)據(jù)庫,那么載入和存儲(chǔ)cookie的代價(jià)可能會(huì)更高 |
下面是用java寫的一個(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);//維持令牌與用戶之間的映射
conn.zadd("recent:", time, token);//保存令牌最后一次出現(xiàn)的時(shí)間
if(item!=null){
conn.zadd("viewd:"+token, time, item);//根據(jù)這個(gè)令牌來設(shè)置該用戶在這個(gè)時(shí)間戳訪問的商品名字
conn.zremrangeByRank("viewd:"+token, 0, -26);//移除就的用戶記錄,只保留用戶瀏覽過的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í)間確定在線人數(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管理用戶登錄會(huì)話的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 詳解Redis開啟遠(yuǎn)程登錄連接
- redis-cli 使用密碼登錄的實(shí)例
- 實(shí)例詳解Spring Boot實(shí)戰(zhàn)之Redis緩存登錄驗(yàn)證碼
- 詳解Redis使用認(rèn)證密碼登錄
- 基于springboot和redis實(shí)現(xiàn)單點(diǎn)登錄
- SpringBoot+Vue+Redis實(shí)現(xiàn)單點(diǎn)登錄(一處登錄另一處退出登錄)
- 基于Redis實(shí)現(xiàn)每日登錄失敗次數(shù)限制
- php+redis實(shí)現(xiàn)注冊、刪除、編輯、分頁、登錄、關(guān)注等功能示例
- springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析
- 基于session?Redis實(shí)現(xiàn)登錄
相關(guān)文章
利用Redis實(shí)現(xiàn)訂單30分鐘自動(dòng)取消
本文主要介紹了利用Redis實(shí)現(xiàn)訂單30分鐘自動(dòng)取消,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Redis數(shù)據(jù)庫的數(shù)據(jù)傾斜詳解
Redis,英文全稱是Remote Dictionary Server(遠(yuǎn)程字典服務(wù)),是一個(gè)開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,需要的朋友可以參考下2023-07-07
Centos7.3安裝Redis4.0.6詳細(xì)圖文教程
這篇文章主要介紹了Centos7.3安裝Redis4.0.6詳細(xì)教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
Springboot整合Redis與數(shù)據(jù)持久化
這篇文章主要介紹了Springboot整合Redis與Redis數(shù)據(jù)持久化的操作,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
阿里云官方Redis開發(fā)規(guī)范總結(jié)
本文主要介紹了阿里云官方Redis開發(fā)規(guī)范總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

