与cookie不同,session是保存在服务器上的数据。
session的工作流程:
当浏览器访问服务器并发起第一个请求时,服务器会创建一个session对象,生产一个类似于
key-value的键值对,然后将key(实际上是cookie)返回给客户端浏览器,浏览器下次访问
时,将携带保存在浏览器上的key,一起发送请求服务器找到相应的session(value)
使用步骤:
1. 安装 express-session
npm install express-session --save
2. 引入 express-session
const session = require('express-session');
3. 设置官方文档提供的中间件
app.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true,
cookie: {}
}))
4. 使用
设置值:req.session.username = 'zlfan'
获取值:req.session.username
一个简单例子:
const express = require('express')
const session = require('express-session')
const app = express()
const port = 3000
app.use(session({
secret: 'test', //服务器生成 session 签名,可以随意写
resave: false, //强制保存 session 即使它没有变化,不配置会有提示
saveUninitialized: true, //强制将未初始化的 session 存储
cookie: {
maxAge: 1000*60*60,
secure: false, //设置为true,表示只有https协议才能访问
},
rolling: true, //常用属性,刷新过期时间,或者说重新设置过期时间
}))
app.get('/', (req, res) => {
req.session.name = 'zlfan';
res.send('设置session成功')
})
app.get('/getSession', (req, res) => {
if(req.session.name){
res.send('getSession:'+req.session.name)
}else{
res.send('getSession:null')
}
})
app.listen(port)
销毁session
// 1.设置 maxAge = 0,会将所有 session 销毁
req.session.cookie.maxAge = 0;
// 2.销毁指定 session ,如销毁上述例子的 session
req.session.name = '';
// 3.调用 destroy(),可以接收一个回调函数
req.session.destroy();
req.session.destroy( err => {} );
可以将session存储到数据库中,实现session的共享
1. 安装 connect-mongo,你可以选择其他的数据库,redis、mysql
npm install connect-mongo --save
2. 引入 connect-mongo
const session = require('express-session')
const MongoStore = require('connect-mongo')(session)
3. 在 session 中间件配置中添加 store 属性
store: new MongoStore({
url: 'mongodb://127.0.0.1:27017/store',
//不管发出多少请求,在24小时内只更新一次session,除非改变了session
touchAfter: 24 * 3600,
})
//更多参数,参考这里 https://www.npmjs.com/package/connect-mongo
完整代码
const express = require('express')
const session = require('express-session')
const MongoStore = require('connect-mongo')(session)
const app = express()
const port = 3000
app.use(session({
secret: 'test', //服务器生成 session 签名,可以随意写
resave: false, //强制保存 session 即使它没有变化,不配置会有提示
saveUninitialized: true, //强制将未初始化的 session 存储
cookie: {
maxAge: 1000*60*60,
secure: false, //设置为true,表示只有https协议才能访问
},
rolling: true, //刷新过期时间,或者说重新设置过期时间
store: new MongoStore({
url: 'mongodb://127.0.0.1:27017/store',
//不管发出多少请求,在24小时内只更新一次session,除非改变了session
touchAfter: 24 * 3600,
})
}))
app.get('/', (req, res) => {
req.session.name = 'zlfan';
res.send('设置session成功')
})
app.get('/getSession', (req, res) => {
if(req.session.name){
res.send('getSession:'+req.session.name)
}else{
res.send('getSession:null')
}
})
app.listen(port)