會話狀態的保留,即登錄狀態保持,是很常見、很常用的功能。
本文將介紹,在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) { //登錄校驗 if((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"); } }); });
代碼很簡潔,如上,且有詳細註釋。功能原理在上文中也已說明,在此不再贅述。
運行效果:
先啓動服務端:
首次登錄時,後面提示:
刷新或重打開頁面,不需要重新輸入帳號密碼,會自動進入登錄狀態:
原創文章,不限轉載。歡迎分享學習,大家一起進步。