本文介紹下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)小結
.