express 中session的使用

与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", //服务器端生成session的签名
    // name:"something name",//修改session对应cookie的名称
    resave: true, //强制保存session 即使他并没有发生变化
    saveUninitialized: true, //强制将未初始化的session存储
    cookie: {
      //session是基于cookies的
      maxAge: 1000 * 8,
      secure: false, //true表示只有https协议才能访问cookie
      rolling:true,//每次请求强行设置cookie,这件重置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存储到数据库中,实现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,   
    })

完整代码

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)
原文地址:https://www.cnblogs.com/bitlei/p/14390908.html