用cookie實現websocket自動登錄,session狀態保留。

會話狀態的保留,即登錄狀態保持,是很常見、很常用的功能。

本文將介紹,在NodeJS開發中,如何實現websocket連接的會話(Session)狀態保持。

注意,是websocket通信,一般常見的介紹是Http登錄狀態,websocket實現方案很少。

31d53fe79e5649089e4798ab0610df8d

要實現的效果是:

輸入帳號密碼登錄,登錄後刷新、關閉頁面均不影響登錄狀態、還會自動進入登錄後的頁面。

實現方法詳細:

原理:

在服務端,當登錄操作時,保存客戶cookie,

如果再次有連接,檢查連接請求的cookie是否與登錄客戶保留的cookie一致,如果一致則認爲已經登錄,無需再次校驗。

上代碼、上實例

在本例中,上述功能主要需兩個文,一個服務器、一個客戶端。

63a403b62a7c4a09bdab2c4fb5822bf3

1、客戶端index.html頁面代碼如下:

b74899275af8408f8df1d87cb43d1e59

<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>

即一個輸入帳號密碼進行登錄的頁面。

e7442c0c55fb433a9e1bc1f6b4b2f845

2、服務端server.js代碼如下:

e75870ad3be345bdb2fb769b0b44ab59

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");
        }
    });
});

代碼很簡潔,如上,且有詳細註釋。功能原理在上文中也已說明,在此不再贅述。

運行效果:

先啓動服務端:

6880cd804ad54438800b13b31ea9a489

首次登錄時,後面提示:

746b54da17d24759a117019fbab8e087

刷新或重打開頁面,不需要重新輸入帳號密碼,會自動進入登錄狀態:

b30780d8a0b849cf82186d7f6f148789

原創文章,不限轉載。歡迎分享學習,大家一起進步。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章