以下是详细的“Express + Session 实现登录验证功能”的完整攻略。
什么是 Session
Session 是用来存储用户与 web 服务器交互过程中产生的数据的一种机制。当用户访问 web 服务器时,服务器会生成一个 Session ID,用来标识用户的身份信息,将其发送给客户端,客户端在访问服务器时带上这个 Session ID,服务器根据 Session ID 来识别用户的身份。一般来说,Session 数据存储于服务器的内存或者数据库中。
Express 中使用 Session
Express 通过 express-session 模块来实现 Session 的功能。下面,我们来讲解如何在 Express 中使用 Session 实现登录验证功能。
首先,需要使用 npm install express-session
命令来安装 express-session 模块。
接着,在使用了 body-parser 进行 post 请求的中间件之后,需要添加 Session 的中间件:
var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session'); // 引入 Session 模块
// 创建服务器应用程序
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
// 添加 Session 的中间件
app.use(session({
secret: 'secret key',
resave: false,
saveUninitialized: true
}));
// 路由设置
上述代码中,创建了 app
应用程序,使用了 body-parser 中间件,然后使用 app.use()
方法添加了 Session 中间件。下面,我们来详细说明各个参数的含义:
secret
: Session 的密钥,用于加密 Session ID。该参数的值可以是一个字符串或一个数组,如果是数组,可以设置多个密钥,这样可以增加 Session 的安全性。resave
: 强制保存 Session,即使 Session 没有被修改,也要重新保存。建议将其设置为false
,以避免 Session 被频繁保存。(但是,如果使用了监视文件系统的 Session 存储,则建议将其设置为true
)saveUninitialized
: 强制将未初始化的 Session 存储。建议将其设置为true
,以避免 Session 无故被删除。
在添加了 Session 的中间件之后,我们就可以使用 req.session
对象访问 Session 中存储的数据了。下面,我们设置一个用于登录验证的路由:
app.post('/login', function(req, res) {
var username = req.body.username;
var password = req.body.password;
// 省略用户名密码的验证过程
// 将用户信息存储到 Session 中
req.session.user = {
username: username
};
res.redirect('/');
});
app.get('/', function(req, res) {
if (req.session.user) {
res.send('Hello, ' + req.session.user.username + '!');
} else {
res.redirect('/login');
}
});
app.get('/login', function(req, res) {
res.send(`
<form method="post" action="/login">
<div>
<label for="username">Username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
</div>
<div>
<button>Log in</button>
</div>
</form>
`);
});
在上述代码中,我们创建了一个用于登录验证的路由(/login
),当表单数据提交到该路由时,会将用户名和密码进行验证,如果验证通过,则将用户信息存储到 Session 中,然后重定向到首页(/
);如果验证不通过,则返回登录页。
在首页的路由(/
)中,我们首先判断用户是否已经登录,如果已经登录,则显示欢迎信息;如果没有登录,则重定向到登录页。登录页的路由(/login
)中,我们设置了一个表单,用于提交用户名和密码。
另外,为了验证 Session 是否成功存储了用户信息,我们还可以增加一个注销的路由:
app.get('/logout', function(req, res) {
delete req.session.user;
res.redirect('/login');
});
当用户访问 /logout
路由时,会清除 Session 中的用户信息,并重定向到登录页。
到此,我们就成功地使用 Session 实现了登录验证功能。如果需要将用户信息存储到数据库中,可以使用 connect-mongo 或 connect-redis 等模块,进行 Session 存储的扩展。
示例说明
示例一
下面,我们以一个简单的示例来详细说明如何使用 Session 实现登录验证功能。在该示例中,我们创建了一个简单的 Web 程序,包含了登录、注销和欢迎页面:
var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: 'secret key',
resave: false,
saveUninitialized: true
}));
app.post('/login', function(req, res) {
var username = req.body.username;
var password = req.body.password;
// 省略用户名密码的验证过程
req.session.user = {
username: username
};
res.redirect('/');
});
app.get('/', function(req, res) {
if (req.session.user) {
res.send('Hello, ' + req.session.user.username + '<br><a href="/logout">Logout</a>');
} else {
res.redirect('/login');
}
});
app.get('/login', function(req, res) {
res.send(`
<form method="post" action="/login">
<div>
<label for="username">Username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
</div>
<div>
<button>Log in</button>
</div>
</form>
`);
});
app.get('/logout', function(req, res) {
delete req.session.user;
res.redirect('/login');
});
app.listen(3000, function() {
console.log('Server is running at http://localhost:3000');
});
在创建了 app 应用程序之后,我们使用了 bodyParser 中间件、Session 中间件和路由定义。在登录路由(/login
)中,我们先获取表单中的用户名和密码,然后省略了用户名密码的验证过程,将用户信息存储到 Session 中,并重定向到首页(/
)。在首页路由中,我们先判断用户是否已经登录,如果已经登录,则显示欢迎信息和注销链接;否则,重定向到登录页。在登录页路由中,我们设置了一个用于提交用户名和密码的表单。在注销路由(/logout
)中,我们清除了 Session 中的用户信息,并重定向到登录页。
如果我们启动该 Web 应用程序,然后在浏览器中访问 http://localhost:3000 ,会跳转到登录页。在登录页中,输入任意用户名和密码,然后点击登录按钮,会跳转到首页,并显示欢迎信息和注销链接。如果点击注销链接,则会重定向到登录页,且无法再通过 http://localhost:3000 直接访问到首页。
示例二
下面,我们使用 connect-mongo 模块来扩展 Session 的存储,用于在 MongoDB 中存储用户的 Session 数据。首先,需要使用 npm install connect-mongo
命令来安装 connect-mongo 模块。
在安装完成之后,我们可以通过下面的代码来连接 MongoDB 数据库,并使用 connect-mongo 模块来实现 Session 的存储:
var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session); // 引入 connect-mongo 模块
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: 'secret key',
resave: false,
saveUninitialized: true,
store: new MongoStore({
url: 'mongodb://localhost/session',
ttl: 14 * 24 * 60 * 60 // 14 天后自动清除 Session 数据
})
}));
app.post('/login', function(req, res) {
var username = req.body.username;
var password = req.body.password;
// 省略用户名密码的验证过程
req.session.user = {
username: username
};
res.redirect('/');
});
app.get('/', function(req, res) {
if (req.session.user) {
res.send('Hello, ' + req.session.user.username + '<br><a href="/logout">Logout</a>');
} else {
res.redirect('/login');
}
});
app.get('/login', function(req, res) {
res.send(`
<form method="post" action="/login">
<div>
<label for="username">Username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
</div>
<div>
<button>Log in</button>
</div>
</form>
`);
});
app.get('/logout', function(req, res) {
delete req.session.user;
res.redirect('/login');
});
app.listen(3000, function() {
console.log('Server is running at http://localhost:3000');
});
上述代码中,我们添加了一个 store 选项,用于设置 Session 数据的存储策略。在 store 中,我们使用了 connect-mongo 模块来连接 MongoDB 数据库,当用户进行登录验证时,会将用户信息存储到 MongoDB 中,并生成一个对应的 Session ID,在后续访问中根据 Session ID 来识别用户的身份信息。在 store 中,我们还设置了一个 ttl
参数(time to live),表示 Session 数据的过期时间,如果用户超过该时间没有访问该站点,则 Session 数据会被自动清除。
到此,我们就成功地使用 connect-mongo 模块来扩展了 Session 的存储,使得用户的 Session 数据可以存储到 MongoDB 中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Express + Session 实现登录验证功能 - Python技术站