当咱们登陆了一个网站,在没有退出登陆的状况下,咱们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登陆状态。这是由于,当咱们登陆了一个网站,服务器会保存咱们的登陆状态,直到咱们退出登陆,或者保存的登陆状态过时。那服务器是经过什么存储咱们的登陆状态的呢? 答案就是 Session ,服务经过 Session 可以记录每一个客户端链接的状态。关于 Session 的原理,在这就很少说了,本文主要介绍在 Express 框架中,如何使用 Session 来实现用户登陆身份验证。javascript
在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
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