当在Web应用程序中存储用户数据时,会使用会话(Session)来跟踪和维护用户状态。通常情况下,使用session需要在Web框架中配置和使用,但是在Node.js中,我们可以使用一个非常流行的中间件——express-session
来实现会话管理。
安装
npm install express-session
使用
在Express应用程序中使用express-session
中间件,必须按照以下步骤进行配置:
- 导入
express-session
模块 - 在Express中使用session
- 配置session中间件
- 使用session
进行详细讲解,如下:
导入express-session
模块
const session = require('express-session');
在Express中使用session
app.use(session({
secret: 'my-secret', // session加密的密钥
resave: false, // 强制保存session即使没有变化
saveUninitialized: false // 强制创建一个session,即使用户未登录
}));
配置session中间件
在app.use(session({...}))
语句中,可以使用很多配置项来进行个性化配置,这里只介绍其中几个常用的配置项:
- secret:用于加密session的密钥,建议使用由字符串构成的随机字符串来保证安全性。
- resave:即使session没有变化,也强制将session存回会话存储器中。默认为true。
- saveUninitialized:强制将未初始化的session存回存储器中,即使session在没有更改之前从未被使用过。默认为true。
- name:session在cookie中的名称。默认为'connect.sid'。
- store:配置session存储器,可以选择内存存储、文件存储、数据库存储等方式。
- cookie:配置session在客户端存储的cookie信息,包括过期时间、路径和域等信息。
使用session
在经过上述配置后,就可以使用req.session
来读取和写入session值了。
app.get('/', (req, res) => {
// 保存session值
req.session.username = 'hello';
// 读取session值
const username = req.session.username;
res.send(`Hello, ${username}`);
});
在上述的代码中,我们使用req.session.username
来保存和读取session中的值,具体的实现方式是通过在客户端保存一个session ID的Cookie,在服务端通过这个Cookie找到对应的session数据。
示例
下面以两个示例来具体说明express-session
的使用。
示例1:基础使用
const express = require('express');
const session = require('express-session');
const app = express();
// 配置session
app.use(session({
secret: 'my-secret', // session加密的密钥
resave: false, // 强制保存session即使没有变化
saveUninitialized: false // 强制创建一个session,即使用户未登录
}));
// 访问根路径,保存session信息
app.get('/', (req, res) => {
req.session.username = 'hello';
res.send(`Hello, ${req.session.username}`);
});
// 访问/user路径,读取session信息
app.get('/user', (req, res) => {
const username = req.session.username;
res.send(`Hello, ${username}`);
});
// 监听端口3000
app.listen(3000, () => {
console.log('Server is running on port 3000...');
});
在示例1中,我们使用req.session.username
来保存和读取session中的值,通过访问根路径和/user路径来测试session的保存和读取,控制台输出如下:
Server is running on port 3000...
Hello, hello
Hello, hello
示例2:结合Passport.js使用
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const app = express();
// 配置session
app.use(session({
secret: 'my-secret', // session加密的密钥
resave: false, // 强制保存session即使没有变化
saveUninitialized: false // 强制创建一个session,即使用户未登录
}));
// 绑定Passport到session中
app.use(passport.initialize());
app.use(passport.session());
// 配置本地认证策略
passport.use(new LocalStrategy(
(username, password, done) => {
if(username === 'admin' && password === 'password') {
done(null, {id: 1, username: 'admin'});
} else {
done(null, false);
}
}
));
// 序列化和反序列化用户会话
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
done(null, {id: id, username: 'admin'});
});
// 访问根路径,进行身份认证
app.get('/', passport.authenticate('local', {}), (req, res) => {
res.send('Hello, ' + req.user.username);
});
// 获取用户信息
app.get('/user', (req, res) => {
res.send('ID: ' + req.user.id + ', Name: ' + req.user.username);
});
// 监听端口3000
app.listen(3000, () => {
console.log('Server is running on port 3000...');
});
在示例2中,我们使用了Passport.js来进行身份认证,并将Passport绑定到session中来实现会话管理。控制台输出如下:
Server is running on port 3000...
Hello, admin
ID: 1, Name: admin
总结
express-session
是一个非常强大的Node.js会话管理中间件,可以极大地简化我们的Web应用程序开发工作。通过上述的介绍和示例,相信读者已经掌握了这个中间件的基本使用方法,并且可以应用到自己的项目中去。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node中的session的具体使用 - Python技术站