本文摘錄自《Nodejs學習筆記》,更多章節及更新,請訪問 github主頁地址。歡迎加羣交流,羣號 197339705。javascript
本文基於express、express-session實現了簡易的登陸/登出功能,完整的代碼示例能夠在這裏找到。html
首先,初始化項目java
express -e
而後,安裝依賴。node
npm install
接着,安裝session相關的包。jquery
npm install --save express-session session-file-store
配置以下,並不複雜,能夠見代碼註釋,或者參考官方文檔。git
var express = require('express'); var app = express(); var session = require('express-session'); var FileStore = require('session-file-store')(session); var identityKey = 'skey'; app.use(session({ name: identityKey, secret: 'chyingp', // 用來對session id相關的cookie進行簽名 store: new FileStore(), // 本地存儲session(文本文件,也能夠選擇其餘store,好比redis的) saveUninitialized: false, // 是否自動保存未初始化的會話,建議false resave: false, // 是否每次都從新保存會話,建議false cookie: { maxAge: 10 * 1000 // 有效期,單位是毫秒 } }));
首先,在本地建立個文件,來保存可用於登陸的帳戶信息,避免建立連接數據庫的繁瑣。github
// users.js module.exports = { items: [ {name: 'chyingp', password: '123456'} ] };
實現登陸、登出接口,其中:ajax
登陸:若是用戶存在,則經過req.regenerate
建立session,保存到本地,並經過Set-Cookie
將session id保存到用戶側;redis
登出:銷燬session,並清除cookie;數據庫
var users = require('./users').items; var findUser = function(name, password){ return users.find(function(item){ return item.name === name && item.password === password; }); }; // 登陸接口 app.post('/login', function(req, res, next){ var sess = req.session; var user = findUser(req.body.name, req.body.password); if(user){ req.session.regenerate(function(err) { if(err){ return res.json({ret_code: 2, ret_msg: '登陸失敗'}); } req.session.loginUser = user.name; res.json({ret_code: 0, ret_msg: '登陸成功'}); }); }else{ res.json({ret_code: 1, ret_msg: '帳號或密碼錯誤'}); } }); // 退出登陸 app.get('/logout', function(req, res, next){ // 備註:這裏用的 session-file-store 在destroy 方法裏,並無銷燬cookie // 因此客戶端的 cookie 仍是存在,致使的問題 --> 退出登錄後,服務端檢測到cookie // 而後去查找對應的 session 文件,報錯 // session-file-store 自己的bug req.session.destroy(function(err) { if(err){ res.json({ret_code: 2, ret_msg: '退出登陸失敗'}); return; } // req.session.loginUser = null; res.clearCookie(identityKey); res.redirect('/'); }); });
用戶訪問 http://127.0.0.1:3000 時,判斷用戶是否登陸,若是是,則調到用戶詳情界面(簡陋無比);若是沒有登陸,則跳到登陸界面;
app.get('/', function(req, res, next){ var sess = req.session; var loginUser = sess.loginUser; var isLogined = !!loginUser; res.render('index', { isLogined: isLogined, name: loginUser || '' }); });
最後,看下登陸、登出UI相關的代碼。
<!DOCTYPE html> <html> <head> <title>會話管理</title> </head> <body> <h1>會話管理</h1> <% if(isLogined){ %> <p>當前登陸用戶:<%= name %>,<a href="/logout" id="logout">退出登錄</a></p> <% }else{ %> <form method="POST" action="/login"> <input type="text" id="name" name="name" value="chyingp" /> <input type="password" id="password" name="password" value="123456" /> <input type="submit" value="登陸" id="login" /> </form> <% } %> <script type="text/javascript" src="/jquery-3.1.0.min.js"></script> <script type="text/javascript"> $('#login').click(function(evt){ evt.preventDefault(); $.ajax({ url: '/login', type: 'POST', data: { name: $('#name').val(), password: $('#password').val() }, success: function(data){ if(data.ret_code === 0){ location.reload(); } } }); }); </script> </body> </html>