Express + Session 實現(xiàn)登錄驗證功能
1. 寫在前面
當我們登錄了一個網站,在沒有退出登錄的情況下,我們關閉了這個網站 ,過一段時間,再次打開這個網站,依然還會是登錄狀態(tài)。這是因為,當我們登錄了一個網站,服務器會保存我們的登錄狀態(tài),直到我們退出登錄,或者保存的登錄狀態(tài)過期。那服務器是通過什么存儲我們的登錄狀態(tài)的呢? 答案就是 Session ,服務通過 Session 能夠記錄每個客戶端連接的狀態(tài)。關于 Session 的原理,在這就不多說了,本文主要介紹在 Express 框架中,如何使用 Session 來實現(xiàn)用戶登錄身份驗證。
2. 環(huán)境配置
在Node 環(huán)境中, 并沒有集成 Express 和 Session 的庫,因此需要進行安裝,首先進入建立一個項目目錄,然后在項目根目錄中,利用下面命令安裝四個模塊。
1) Express
該模塊能夠讓我們快速的搭建一個 Web 開發(fā)框架。
2) body-parser
該模塊是 Express 模塊的中間件,方便我們解析瀏覽器發(fā)送來的 body 數據。
3) express-session
該模塊也是 Express 模塊中間件,方便我們處理客戶端的 session。
4) ejs
該模塊是一個渲染引擎。 方便我們將后臺變量數據綁定到前臺頁面上。
安裝如下:
npm install express --save npm install body-parser --save npm install express-session --save npm install ejs --save
3. 登錄與驗證
Session 能夠標記客戶端在服務器上的狀態(tài)。利用這一點,我們能夠實現(xiàn)客戶端的登錄驗證。Session 登錄驗證的流程大致為:客戶端若在未登錄的狀態(tài)下請求主頁,那么服務器將該請求重定向到登錄頁面;客戶端在登錄后,服務器需要記錄保存該客戶端的登錄狀態(tài),并給予一個活動期限,這樣下一次服務器請求主頁的時候,就能夠判斷該客戶端的登錄狀態(tài),若登錄狀態(tài)有效,直接返回客戶端需要的頁面,否則重定向到登錄頁面。
對于 Session 的過期時間,如果沒有設置 Session 的過期時間,服務器會根據自己配置中默認有效期,將長期不與服務器交互的 Session 進行刪除。
下面貼出實例代碼,界面比較簡單,服務器后臺代碼注釋寫的很清楚,因此就不再進行說明了。
項目的目錄結構如下:
登錄頁面(login.html) 代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
</style>
</head>
<body>
<form action="/login" method="POST">
用戶名: <input type="text" name="username"/> <br>
密碼: <input type="password" name="pwd"/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
主頁(home.html)代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>用戶名:<span><%= username %> </span> <a href="/logout" rel="external nofollow" >退出登錄</a></div> </body> </html>
服務器(app.js)代碼如下:
/**
* Created by tjm on 9/7/2017.
*/
var express = require('express');
var app = express();
var session = require('express-session');
var bodyparser = require('body-parser');
// 下面三行設置渲染的引擎模板
app.set('views', __dirname); //設置模板的目錄
app.set('view engine', 'html'); // 設置解析模板文件類型:這里為html文件
app.engine('html', require('ejs').__express); // 使用ejs引擎解析html文件中ejs語法
app.use(bodyparser.json()); // 使用bodyparder中間件,
app.use(bodyparser.urlencoded({ extended: true }));
// 使用 session 中間件
app.use(session({
secret : 'secret', // 對session id 相關的cookie 進行簽名
resave : true,
saveUninitialized: false, // 是否保存未初始化的會話
cookie : {
maxAge : 1000 * 60 * 3, // 設置 session 的有效時間,單位毫秒
},
}));
// 獲取登錄頁面
app.get('/login', function(req, res){
res.sendFile(__dirname + '/login.html')
});
// 用戶登錄
app.post('/login', function(req, res){
if(req.body.username == 'admin' && req.body.pwd == 'admin123'){
req.session.userName = req.body.username; // 登錄成功,設置 session
res.redirect('/');
}
else{
res.json({ret_code : 1, ret_msg : '賬號或密碼錯誤'});// 若登錄失敗,重定向到登錄頁面
}
});
// 獲取主頁
app.get('/', function (req, res) {
if(req.session.userName){ //判斷session 狀態(tài),如果有效,則返回主頁,否則轉到登錄頁面
res.render('home',{username : req.session.userName});
}else{
res.redirect('login');
}
})
// 退出
app.get('/logout', function (req, res) {
req.session.userName = null; // 刪除session
res.redirect('login');
});
app.listen(8000,function () {
console.log('http://127.0.0.1:8000')
})
到此,session 實現(xiàn)登錄驗證就完成。上面的例子 session 是保存在服務內存中,當然還可以保存在文件或數據庫中,只需要配置 session 中間件即可。
app.use(session({
secret: 'secretkey',
store: new MongoStore({
db: 'sessiondb'
})
}));
上面的代碼則是將 session 保存到 MongoDB 數據庫,當然 Session 的配置還有一些,具體參考:
https://www.npmjs.com/package/express-session
總結
以上所述是小編給大家介紹的Express + Session 實現(xiàn)登錄驗證功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
- Nodejs進階:express+session實現(xiàn)簡易登錄身份認證
- Node.js+Express+MySql實現(xiàn)用戶登錄注冊功能
- 用node和express連接mysql實現(xiàn)登錄注冊的實現(xiàn)代碼
- Node+Express+MongoDB實現(xiàn)登錄注冊功能實例
- express框架中使用jwt實現(xiàn)驗證的方法
- express + jwt + postMan驗證實現(xiàn)持久化登錄
- Vue+Express實現(xiàn)登錄狀態(tài)權限驗證的示例代碼
- nodejs使用express獲取get和post傳值及session驗證的方法
- DevExpress實現(xiàn)GridControl單元格編輯驗證的方法
- Express實現(xiàn)登錄驗證
相關文章
node實現(xiàn)批量上傳本地圖片轉為圖片CDN的項目實踐
本文主要介紹了node實現(xiàn)批量上傳本地圖片轉為圖片CDN的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
Node.js發(fā)出請求走Proxyman代理調試tip詳解
這篇文章主要為大家介紹了Node.js發(fā)出請求走Proxyman代理調試tip詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
linux服務器快速卸載安裝node環(huán)境(簡單上手)
這篇文章主要介紹了linux服務器快速卸載安裝node環(huán)境(簡單上手),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
node?NPM庫glob通配符匹配文件名minimatch模式匹配字符串學習
這篇文章主要為大家介紹了node?NPM庫glob通配符匹配文件名minimatch模式匹配字符串學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)
這篇文章主要給大家介紹了關于如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)的相關資料,nvm是一個node版本管理工具,通過它可以安裝多種node版本并且可以快速、簡單的切換node版本,需要的朋友可以參考下2023-10-10
node.js報錯:Cannot find module ''ejs''的解決辦法
最近發(fā)現(xiàn)了node.js居然報錯了,錯誤提示為:Cannot find module 'ejs',后來找了找資料發(fā)現(xiàn)解決的方法其實很簡單,下面通過這篇文章來一起看看吧,希望對同樣遇到這個問題的朋友們能有所幫助。2016-12-12

