Express + Session 實現登陸驗證

1. 寫在前面

當咱們登陸了一個網站,在沒有退出登陸的狀況下,咱們關閉了這個網站 ,過一段時間,再次打開這個網站,依然還會是登陸狀態。這是由於,當咱們登陸了一個網站,服務器會保存咱們的登陸狀態,直到咱們退出登陸,或者保存的登陸狀態過時。那服務器是經過什麼存儲咱們的登陸狀態的呢? 答案就是 Session ,服務經過 Session 可以記錄每一個客戶端鏈接的狀態。關於 Session 的原理,在這就很少說了,本文主要介紹在 Express 框架中,如何使用 Session 來實現用戶登陸身份驗證。javascript

2. 環境配置

在Node 環境中, 並無集成 Express 和 Session 的庫,所以須要進行安裝,首先進入創建一個項目目錄,而後在項目根目錄中,利用下面命令安裝四個模塊。
1) Express
該模塊可以讓咱們快速的搭建一個 Web 開發框架。
2) body-parser
該模塊是 Express 模塊的中間件,方便咱們解析瀏覽器發送來的 body 數據。
3) express-session
該模塊也是 Express 模塊中間件,方便咱們處理客戶端的 session。
4) ejs
該模塊是一個渲染引擎。 方便咱們將後臺變量數據綁定到前臺頁面上。
安裝以下:css

npm install express --save
npm install body-parser --save
npm install express-session --save
npm install ejs --save

3. 登陸與驗證

Session 可以標記客戶端在服務器上的狀態。利用這一點,咱們可以實現客戶端的登陸驗證。Session 登陸驗證的流程大體爲:客戶端若在未登陸的狀態下請求主頁,那麼服務器將該請求重定向到登陸頁面;客戶端在登陸後,服務器須要記錄保存該客戶端的登陸狀態,並給予一個活動期限,這樣下一次服務器請求主頁的時候,就可以判斷該客戶端的登陸狀態,若登陸狀態有效,直接返回客戶端須要的頁面,不然重定向到登陸頁面。html

對於 Session 的過時時間,若是沒有設置 Session 的過時時間,服務器會根據本身配置中默認有效期,將長期不與服務器交互的 Session 進行刪除。java

下面貼出實例代碼,界面比較簡單,服務器後臺代碼註釋寫的很清楚,所以就再也不進行說明了。數據庫

項目的目錄結構以下:express

登陸頁面(login.html) 代碼以下:npm

<!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)代碼以下:json

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>用戶名:<span><%= username %> </span>  <a href="/logout">退出登陸</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 狀態,若是有效,則返回主頁,不然轉到登陸頁面
        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 實現登陸驗證就完成。上面的例子 session 是保存在服務內存中,固然還能夠保存在文件或數據庫中,只須要配置 session 中間件便可。服務器

app.use(session({
    secret: 'secretkey',
    store: new MongoStore({
        db: 'sessiondb'
    })
}));

上面的代碼則是將 session 保存到 MongoDB 數據庫,固然 Session 的配置還有一些,具體參考:https://www.npmjs.com/package/express-session

相關文章
相關標籤/搜索