萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> Node.js編程中客戶端Session的使用詳解

Node.js編程中客戶端Session的使用詳解

   這篇文章主要介紹了Node.js編程中客戶端Session的使用詳解,是Node.js入門學習中的基礎知識,需要的朋友可以參考下

  靜態網站很容易擴展。你只需要全部緩存,不需要考慮從不同服務器組合有狀態的內容給用戶。

  可惜,大多數Web應用使用有狀態的內容提供個性化體驗。如果你的應用可以登錄,就需要記住用戶的Session。經典的處理方法是客戶端設置包含隨機唯一Session標識的Cookie,被標識的Session數據保存到服務端。

  擴展有狀態服務

  當擴展服務的時候,你肯定有三種選擇:

  不同服務端同步Session數據

  不同服務端連接單點中心(獲取Session)

  保證用戶訪問同一個服務端

  但都有缺陷:

  同步數據增加性能開銷

  單點中心降低系統擴展性

  如果用戶上次訪問的服務端需要維護怎麼辦

  然而,如果你換個角度思考,會發現第四種選擇:將Session數據保存在客戶端

  客戶端Session

  在客戶端保存Session有一些優勢:

  無所謂哪個服務端,Session數據都有效

  不需要維護服務端狀態

  不需要服務端同步

  任意添加新的服務端

  但是客戶端Session存在一個嚴重問題:你不能保證用戶不篡改Session數據。

  比如你在Cookie中保存用戶的ID。用戶很容易修改它,從而訪問別人的賬戶。

  這似乎否定了客戶端Session的可能,但有一種方法可以巧妙解決這問題:加密打包Session數據(還是存在Cookie中)。這樣就不需要擔心用戶修改Session數據,服務端會驗證數據的。

  實際應用上,就是Cookie中保存一個加密的Server Key。Server Key驗證後才有權利讀取和修改Session數據。這就是客戶端Session。

  Node客戶端Session

  Node.JS有一個庫可以實現客戶端Session:node-client-session.它可以代替Connect(一個Node中間件框架)內置的session和cookieParser中間件。

  在Express框架應用中的使用:

  ?

  1const clientSessions = require("client-sessions");

  ?

  1app.use(clientSessions({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK' // 設置一個隨機長字符串! })

  然後,向req.session對象添加屬性:

  ?

  1app.get('/login', function (req, res){ req.session.username = 'JohnDoe'; });

  讀取屬性:

  ?

  1app.get('/', function (req, res){ res.send('Welcome ' + req.session.username); });

  使用reset方法終止Session:

  ?

  1app.get('/logout', function (req, res) { req.session.reset(); });

  即時注銷Persona Session

  (注:Persona是Mozzilla推出的網絡身份系統)

  與服務器端Session不同,客戶端Session的問題是服務端無法刪除Session。

  服務器端架構時,你可以刪除Session數據。任意的客戶端Cookie標識的Session很可能不存在。但客戶端架構時,Session數據不在服務端,不能保證Session數據在每個客戶端都被刪除。換句話說,我們無法同步用戶的客戶端狀態(已經登錄)和服務端狀態(注銷登錄)。

  為了彌補這個缺陷,客戶端Session中添加了過期時間。展開Session數據(被加密打包)前驗證過期時間。如果過期了,拋棄Session數據並改變用戶狀態(如注銷登錄)。

  過期機制在很多應用中運行良好(尤其是短過期時間需求)。如在Persona中,當用戶發覺密碼收到威脅或已經損壞時,我們需要提供方法讓用戶立即注銷Session數據。

  這意味著需要保留一點點狀態信息在服務後端。我們處理即時注銷的方法是添加一個Token在用戶數據表和Session數據中。

  每次API調用時比對Session數據中的Token和數據庫中的Token。如果不相同,返回錯誤信息並退出用戶。

  這樣會附加多余的數據庫操作去查詢Token。幸好,大多數的API調用都需要讀取用戶數據表,把Token一起帶上就好了。

copyright © 萬盛學電腦網 all rights reserved