简介
express-session
是express中的一个处置惩罚session
的中间件,能够说是express
中最罕见的中间件之一了.
因为会话治理依靠cookie
的运用,所以它的api中有许多用于掌握cookie
的部份.
总的来说express-session
有以下的特性:
- session治理(基础功能)
- cookie署名
- 可替代耐久贮存模块
本文中运用的版本为1.15.6
.
装置
npm install express-session --save
引入&运用
const express = require('express');
const app = new express();
const expressSession = require('express-session');
// 运用express-session
app.use(expressSession({
secret:'hello world',// cookie署名 这个属性是必需的 详细设置和`cookie-parser`一样
saveUninitialized:true, // 是不是自动初始化 默以为true
resave:false,// 当用户session无变化的时刻依旧自动保存
cookie:{ // cookie的信息详细操纵和`cookie-parser`一样
maxAge:1800000// 30分钟后逾期
},
rolling:true// 每次要求的时刻覆写cookie
}))
会话简介
在express-session
文档中有以下的一句申明:
Note Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.
Session中包括的数据不会保存在cookie中,仅仅是在cookie中保存了一个SessionId罢了.现实的session的数据保存在服务端.
简朴明白就是一个Map,键对应的是session id
值保存在cookie
中,值对应的是用户保存在服务端的数据.
api引见
参数
建立express-cookie
参数基础分为两种.
- 针关于
cookie
的设置 - 针关于
express-session
的设置
cookie设置一览:
app.use(expressSession({
secret:'hello world', // cookie 署名必需有不然会报错
cookie:{
domain:<参数>,
expires:<参数>,
httpOnly:<参数>,
path:<参数>,
sameSite:<参数>,
secure:<参数>,
maxAge:1800000
}
}));
而这些对应的参数就是服务端关于cookie的写入参数,至于各个参数是什么意义参考下面的文章:
express-session部份设置:
app.use(expressSession({
secret:'hello world', // cookie 署名必需有不然会报错
genid:function (request) { // 用于替代掉默许ID天生的函数 第一个参数为reqeust
return '随机id'
},
name:'connect.sid',// 每次相应中向cookie中肇端的内容,默许肇端为`connect.sid`,
proxy:true,// 关于cookie运用secure后,在通报的过程当中置信反向代办服务器,默以为undefined只置信正向代办
resave:true,// 在一次会话中不管是不是session被转变都邑举行强迫的贮存
rolling:true,// 在每次会话中的相应中都覆写一次cookie,重置倒计时
saveUninitialized:true,// 将一个新建立还未修正的会话举行贮存,默以为true
store:object// 一个贮存对象,默许运用的是`MemoryStore`这个存储器
unset:'keep'// 掌握没有设置`req.session`时刻的行动(运用delete删除或许赋值null),默许'keep'会话时期不会保存,'destroy'会话完成后删除.
}));
要领
在request.session
上挂载的session
对象,除了有你增加的内容外,另有默许的要领存在:
req.session.regenerate(function(err) {
// 挪用这个要领重新天生一个新的会话,完成后触发
})
req.session.destroy(function(err) {
// 删除这个会话,完成后触发
})
req.session.reload(function(err) {
// 重新加载session数据,完成后触发还调
})
req.session.save(function(err) {
// 运用当前内存中的数据保存到贮存器中
// 默许在会话完毕的时刻就会自动挪用这个要领
})
req.session.touch() // 更新cookie中的maxAge,平常不需要手动操纵,交由中间件
属性
一样的在session
实例上也有许多属性:
req.session.id // 保存唯一的会话id值,不可修正
req.session.cookie // 以键值对的情势保存cookie的原始数据
req.session.cookie.maxAge // 以毫秒的情势返回盈余存活时候
req.sessionID // 保存唯一的会话id,只读
一个简朴的例子
一个简朴的登录例子:
const express = require('express');
const app = new express();
const expressSession = require('express-session');
const userDb = new Map();
app.use(expressSession({
secret:'hello world',
saveUninitialized:true,
resave:false,
cookie:{
maxAge:1800000
},
rolling:true,
}));
app.get('/login', (request, response) => {
const
id = request.query.id,
pwd = request.query.pwd;
if(id && pwd){
if(userDb.has(id+pwd)){
response.send('该用户已登录');
}else{
request.session.userId = id+pwd;
userDb.set(id+pwd,id);
response.redirect('/');
}
}else{
response.send('请输入准确的帐号和暗码');
}
});
app.get('/logout',(request, response)=>{
const userId = request.session.userId;
request.session.destroy((err)=>{
if(err || !userDb.has(userId)){
response.send('登出失利');
}else{
userDb.delete(userId);
response.send('登出胜利');
}
});
});
app.get('/',(request, response)=>{
if(request.session.userId && userDb.has(request.session.userId)){
response.send(`迎接返来${userDb.get(request.session.userId)}`);
}else{
response.send('还未登录');
}
});
app.use((request, response) => {
response.send('404 not found');
});
app.listen(8888, '127.0.0.1');
在浏览器中顺次输入以下url来模仿登录行动:
localhost:8888/
localhost:8888/login?id=ASCll&pwd=123456
localhost:8888/
localhost:8888/logout
localhost:8888/
暗坑
我在chrome浏览器下运转上面的例子屡次后发明一个题目,浏览器会举行预读取网页来进步机能,也就是说在浏览器中当我url输入到以下的地方时:
localhost:8888/logo
依据我之间屡次进入这个页面浏览器会提早接见这个页面localhost:8888/logout
,而致使服务器直接删除session
比及真正进入到页面的时刻已是第二次加载页面了,致使每次登出都显现失利.
愿望有履历的朋侪能给出一个合理的解决方案.
注重
当express-session
和cookie-parser
一同运用的时刻关于cookie
的署名必需一致.
express-session
的存储实例是能够替换的,默许运用MemoryStore
只适合于测试和开辟运用,临盆环境必需要运用其他的贮存实例,不然会涌现内存碎片题目,在官方文档中给出了已完成的接口,能够对接redis
以及mongodb
等数据库.
该列表在官方文档的末了: