node通過session保存登錄狀態


 本文介紹下node通過session保存登錄狀態

(1)需求分析

  1、登錄成功后下拉框顯示當前登錄用戶:xxx;2、隱藏登錄和注冊按鈕。這里便需要用到session

  ***注意***:

默認session存儲數據是內存存儲,服務器一旦重啟就會丟失,真正生產環境會把session進行持久化存儲。不會因為服務端重啟導致session數據丟失
例如結合插件將session數據存儲到MongoDB數據庫

  

   關於cookie和session詳見文章node之cookie和session對比.接下來在Express框架基礎上使用session,但由於express沒有封裝session,所以需要下載第三方包(類似於body-parser中間件)。

  PHP的話內置了session和cookie,以及body-parser,所以無需和node開發一樣下載第三方依賴...

  

 

 

 

(2)步驟

  

 

   我們可以去npmjs.com官網搜索使用demo,這里我們選擇第一個

  

 

   進入后便有具體使用步驟

  1、安裝

    

 

   2、配置(index.js入口文件配置)

    

注意:express-session的配置,一定要放到掛載路由到服務實例app.use(router)之前

     

 

  3、使用(router.js使用)

     

 

     接下來開始使用,在登錄成功時添加session,如下所示

    

 

     當登錄成功后,頁面會重定向到首頁,所以這里在首頁渲染處做下驗證

    

 

     當用戶登錄成功后跳轉到首頁,此時服務端輸出如下

    

 

     此時便可以知道session已經記錄了登錄狀態,此時便可以刷新頁面

***輸出結果為true表示:服務端已經記錄了登錄狀態(超時儲物櫃已經存儲)***
***接下來還需要一把鑰匙cookie(小票二維碼),可以查看客戶端cookie存儲***

    此時可以結合cookie可視化工具來操作,詳情參見cookie可視化操作工具---EditThisCookie.

    

這便是服務器給的那把鑰匙cookie,且具有唯一性。如果將其刪除,則會丟失登錄狀態

    

 

     此時再次刷新頁面,服務端輸出如下“undefined”,此時便會丟失登錄狀態。例如京東、淘寶、GitHub等,當你登錄成功后,刪除客戶端cookie時,便會丟失本網站的登錄狀態,立即退出。詳見文章cookie可視化操作工具---EditThisCookie.

    

 

     

 

(3)過期時間

  當然,session也涉及過期時間,與cookie有關系。cookie過期了,session也就過期了

  因為cookie過期了,小票也就過期了,小票二維碼丟失即鑰匙丟失,session即儲物櫃也就對應不上了。

  接下來利用session編寫操作頁面

  

 

 

 

(4)開發代碼實現

  真正實際開發一般也不會記錄loginStatus:true,一般直接記錄登錄用戶信息,如下所示

  

 

   接下來登錄成功后,可以在渲染首頁時,便會在服務端輸出user

  

  

  接下來開始結合html頁面,實現開始的需求

  

 

   

   測試如下

  1、首先進行登錄

    

 

   2、登錄成功后導航如下所示

    

 

登錄成功后,沒有了登錄和注冊按鈕,只有發起按鈕和用戶下拉列表。

    接下來刪除cookie,清除客戶端的用戶登錄狀態

    

 

     刪除后再次刷新頁面,便會看到退出來登錄狀態... ...,此時導航欄只有注冊登錄按鈕

    

 

 

(5)相關補充

  接下來介紹下express-session配置項

  

 

   1、secret譯為秘密

    這里需要了解md5鞏固加密,即在原始密碼基礎上,為了避免有人拿着二次加密的密碼進行比對,我們可以在加密密碼時加入不規則字符,將加密字符復雜化,增加安全性

    

 

即便有人拿到了密碼二次加密進行比對,但不知道隨機字符,也是無法破解。
同理這里的secret秘密選項目的也是隨機字符,增加安全性

 

    服務端session對應客戶端cookie,每次登陸成功,都會自動為客戶端分配一個sessionid,如下所示就是一個加密字符串

     

     

  2、resave譯為重新保存

    

  3、saveUninitialized譯為保存未初始化

無論你是否使用session,都默認給你分配一把鑰匙

    測試如下,當前是未登錄狀態

    

 

     cookie內容如下

    

 

     接下來清除cookie,再次刷新頁面。便會發現又生成了一條,且和之前不一樣

    

接下來將其改為false,即真正用到session數據時,客戶端再隨機生成鑰匙,修改代碼如下

    

 

     此時再次刷新頁面,查看cookie數據便會發現沒有隨機分配鑰匙

    

 

     接着測試,當需要session保存數據狀態時才需要,那么我們代碼里設計的是登錄成功保存登錄狀態,接着做下登錄測試

    

 

    登錄成功后便會發現隨機分配了鑰匙

     

此時服務端存儲了session數據,記錄了登錄狀態
並且給客戶端分配了一把鑰匙cookie

    

 

 

 

(6)session默認存儲在服務緩存區

注意:session默認是在緩存里存儲,服務器一旦重啟,便再也訪問不到了

  所以接下來在代碼里加個空格,因為是nodemon啟動方式,所以當保存代碼時,服務器便會刷新重啟,如下所示

  

 

   

此時便會發現session為undefined

  如果想解決該問題,可以做持久化session存儲,之后介紹

 

  

 (7)小結

  

 

   

 

 

 

 

 

.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM