濮阳杆衣贸易有限公司

主頁 > 知識庫 > 使用redis管理用戶登錄會話的方法

使用redis管理用戶登錄會話的方法

熱門標簽:最簡單的百度地圖標注 竹間科技AI電銷機器人 百度商家地圖標注怎么做 地圖標注費用 太原營銷外呼系統(tǒng) 小紅書怎么地圖標注店 地圖標注如何即時生效 玄武湖地圖標注 西藏教育智能外呼系統(tǒng)價格

登錄和cookie緩存

對于用來登錄的cookie,有兩種常見的方法可以將登錄信息存儲在cookie里面:一種是簽名(signed)cookie,另一種是令牌(token)cookie。

簽名cookie通常會存儲用戶名,可能還有用戶ID、用戶最后一次成功登陸的時間,以及網站覺得有用的其他任何信息。除了用戶的相關信息外,簽名cookie還包含一個簽名,服務器可以使用這個簽名來驗證發(fā)送的信息是否未經改動(比如將cookie中的登錄用戶名改成另一個客戶)。

令牌cookie會在cookie里面存儲一串隨機字節(jié)作為令牌,服務器可以根據令牌在數據庫中查找令牌的擁有者。下表展示了簽名cookie和令牌cookie的優(yōu)點與缺點。

cookie類型 優(yōu)點 缺點
簽名cookie 驗證cookie所需的一切信息都存儲在cookie里面。cookie可以包含額外的信息(additional information),并且對這些信息進行簽名也很容易 正確地處理簽名很難。很容易忘記對數據進行簽名,或者忘記驗證數據的簽名,從而造成安全漏洞
令牌cookie 添加信息非常容易。cookie的體積非常小,因此移動端和速度較慢的客戶端可以更快地發(fā)送請求 需要在服務器中存儲更多信息。如果使用的是關系數據庫,那么載入和存儲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管理用戶登錄會話的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 詳解Redis開啟遠程登錄連接
  • 詳解Redis使用認證密碼登錄
  • redis-cli 使用密碼登錄的實例
  • 基于Redis無序集合如何實現禁止多端登錄功能

標簽:廣東 香港 林芝 澳門 贛州 唐山 揚州 景德鎮(zhèn)

巨人網絡通訊聲明:本文標題《使用redis管理用戶登錄會話的方法》,本文關鍵詞  使用,redis,管理,用戶,登錄,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用redis管理用戶登錄會話的方法》相關的同類信息!
  • 本頁收集關于使用redis管理用戶登錄會話的方法的相關信息資訊供網民參考!
  • 推薦文章
    右玉县| 寿阳县| 永济市| 公安县| 东海县| 平塘县| 清水县| 邢台县| 崇阳县| 鲁甸县| 乌什县| 泗洪县| 木里| 昌邑市| 兴和县| 东阳市| 建水县| 交口县| 乳源| 犍为县| 文山县| 游戏| 布尔津县| 靖江市| 娄底市| 常德市| 稻城县| 定南县| 西贡区| 青神县| 若羌县| 莱州市| 松滋市| 安义县| 梁山县| 伊春市| 虞城县| 大足县| 咸宁市| 洱源县| 屏东县|