會話狀態的保留,即登入狀態保持,是很常見、很常用的功能。
本文將介紹,在NodeJS開發中,如何實現websocket連線的會話(Session)狀態保持。
注意,是websocket通訊,一般常見的介紹是Http登入狀態,websocket實現方案很少。
要實現的效果是:
輸入帳號密碼登入,登入後重新整理、關閉頁面均不影響登入狀態、還會自動進入登入後的頁面。
實現方法詳細:原理:
在服務端,當登入操作時,儲存客戶cookie,
如果再次有連線,檢查連線請求的cookie是否與登入客戶保留的cookie一致,如果一致則認為已經登入,無需再次校驗。
上程式碼、上例項:
在本例中,上述功能主要需兩個文,一個伺服器、一個客戶端。
1、客戶端index.html頁面程式碼如下:
<html> <head> <meta charset="UTF-8"> </head> <body> <div id="login" style="display: block;"> <form > user: <input type="text" id="user" value="admin"/> <br> pass: <input type="password" id="pass" value="adminpass"/> <br> <input type="button" value="Submit" onclick="login();"/> </form> </div> <div id="logined" style="display: none;"> </div> <script> function login(){ var user = document.getElementById("user").value; var pass = document.getElementById("pass").value; socket_io.emit("login",{"user":user, "pass":pass}); } </script> <script src="socket.io.js"></script> <script> var socket_io = io("http://127.0.0.1:8080"); socket_io.on("login_ret",function(data){ if(data.status == 0){ document.getElementById("login").style.display = "none"; document.getElementById("logined").style.display = "block"; document.getElementById("logined").innerText = "You have logined:" + data.user; } }); </script> </body></html>即一個輸入帳號密碼進行登入的頁面。
2、服務端server.js程式碼如下:
var app = require('express')().listen(8080);var io = require('socket.io')(app);//會話狀態var session = [];//websocket連線io.on('connection', function (socket) { //cookie是否存在 if(socket.request.headers.cookie != undefined){ //遍歷會話,檢查此是否有此cookie對應的登入狀態 for(i=0; i<session.length; i++){ if(session[i].cookie == socket.request.headers.cookie){ console.log(socket.request.headers.cookie); //登入成功 socket.emit("login_ret",{"status":0, "message":"login success", "user":session[i].user}); console.log(session[i].user,"login succcess by session"); return; } } } //登入 socket.on('login', function (data) { //登入校驗\t\tif((data.user="admin") && (data.pass="adminpass")){ if(socket.request.headers.cookie != undefined){ //儲存在會話中 session.push({"cookie":socket.request.headers.cookie,"user":data.user}); } //登入成功 socket.emit("login_ret",{"status":0, "message":"login success", "user":data.user}); console.log(data.user,"login success"); }else{ //登入失敗 socket.emit("login_ret",{"status":1, "message":"login failed", "user":data.user}); console.log(data.user,"login failed"); } });});程式碼很簡潔,如上,且有詳細註釋。功能原理在上文中也已說明,在此不再贅述。
執行效果:先啟動服務端:
首次登入時,後面提示:
重新整理或重開啟頁面,不需要重新輸入帳號密碼,會自動進入登入狀態:
最新評論