您好,登錄后才能下訂單哦!
小編給大家分享一下Express + Session如何實現(xiàn)登錄驗證功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1. 寫在前面
當我們登錄了一個網(wǎng)站,在沒有退出登錄的情況下,我們關(guān)閉了這個網(wǎng)站 ,過一段時間,再次打開這個網(wǎng)站,依然還會是登錄狀態(tài)。這是因為,當我們登錄了一個網(wǎng)站,服務(wù)器會保存我們的登錄狀態(tài),直到我們退出登錄,或者保存的登錄狀態(tài)過期。那服務(wù)器是通過什么存儲我們的登錄狀態(tài)的呢? 答案就是 Session ,服務(wù)通過 Session 能夠記錄每個客戶端連接的狀態(tài)。關(guān)于 Session 的原理,在這就不多說了,本文主要介紹在 Express 框架中,如何使用 Session 來實現(xiàn)用戶登錄身份驗證。
2. 環(huán)境配置
在Node 環(huán)境中, 并沒有集成 Express 和 Session 的庫,因此需要進行安裝,首先進入建立一個項目目錄,然后在項目根目錄中,利用下面命令安裝四個模塊。
1) Express
該模塊能夠讓我們快速的搭建一個 Web 開發(fā)框架。
2) body-parser
該模塊是 Express 模塊的中間件,方便我們解析瀏覽器發(fā)送來的 body 數(shù)據(jù)。
3) express-session
該模塊也是 Express 模塊中間件,方便我們處理客戶端的 session。
4) ejs
該模塊是一個渲染引擎。 方便我們將后臺變量數(shù)據(jù)綁定到前臺頁面上。
安裝如下:
npm install express --save npm install body-parser --save npm install express-session --save npm install ejs --save
3. 登錄與驗證
Session 能夠標記客戶端在服務(wù)器上的狀態(tài)。利用這一點,我們能夠?qū)崿F(xiàn)客戶端的登錄驗證。Session 登錄驗證的流程大致為:客戶端若在未登錄的狀態(tài)下請求主頁,那么服務(wù)器將該請求重定向到登錄頁面;客戶端在登錄后,服務(wù)器需要記錄保存該客戶端的登錄狀態(tài),并給予一個活動期限,這樣下一次服務(wù)器請求主頁的時候,就能夠判斷該客戶端的登錄狀態(tài),若登錄狀態(tài)有效,直接返回客戶端需要的頁面,否則重定向到登錄頁面。
對于 Session 的過期時間,如果沒有設(shè)置 Session 的過期時間,服務(wù)器會根據(jù)自己配置中默認有效期,將長期不與服務(wù)器交互的 Session 進行刪除。
下面貼出實例代碼,界面比較簡單,服務(wù)器后臺代碼注釋寫的很清楚,因此就不再進行說明了。
項目的目錄結(jié)構(gòu)如下:
登錄頁面(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>
服務(wù)器(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'); // 下面三行設(shè)置渲染的引擎模板 app.set('views', __dirname); //設(shè)置模板的目錄 app.set('view engine', 'html'); // 設(shè)置解析模板文件類型:這里為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 相關(guān)的cookie 進行簽名 resave : true, saveUninitialized: false, // 是否保存未初始化的會話 cookie : { maxAge : 1000 * 60 * 3, // 設(shè)置 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; // 登錄成功,設(shè)置 session res.redirect('/'); } else{ res.json({ret_code : 1, ret_msg : '賬號或密碼錯誤'});// 若登錄失敗,重定向到登錄頁面 } }); // 獲取主頁 app.get('/', function (req, res) { if(req.session.userName){ //判斷session 狀態(tài),如果有效,則返回主頁,否則轉(zhuǎn)到登錄頁面 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 是保存在服務(wù)內(nèi)存中,當然還可以保存在文件或數(shù)據(jù)庫中,只需要配置 session 中間件即可。
app.use(session({ secret: 'secretkey', store: new MongoStore({ db: 'sessiondb' }) }));
以上是“Express + Session如何實現(xiàn)登錄驗證功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。