gaowei1012/blog

express express-session 中间件

Opened this issue · 0 comments

express-session是express中的一个处理session的中间件,可以说是express中最常见的中间件之一了.

由于会话管理依赖cookie的使用,所以它的api中有很多用于控制cookie的部分.

主要有以下优点:

  • session管理(基本功能)
  • cookie签名
  • 可替换持久储存模块
const express = require('express')
const expressSession = require('express-session')

const app = new express()


// session middelware
app.use(expressSession({
	secret: 'blog', // cookie 签名,这个必须有
	saveUninitialized: true, // 是否自动初始化, 默认值为true
	resave: false, // 当用户session无变化时候依然自动保持
	cookie: {
		maxAge: 1800000, // 失效时长
	},
	rolling: true, // 每次请求是覆盖上次cookie
}))


app.get('/', function (req, res, next) {
	res.send('hello express')
})

app.listen(8090, function() {
	console.log('start server')
})

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. regenerate(function (err) {
        // 调用这个方法从新生成一个新的会话,完成后触发
    })
req.session.destroy(function(err) {
  // 删除这个会话,完成后触发
})
req.session.reload(function(err) {
  // 从新加载session数据,完成后触发回调
})
req.session.save(function(err) {
  // 使用当前内存中的数据保存到储存器中
  // 默认在会话结束的时候就会自动调用这个方法
})
req.session.touch() // 更新cookie中的maxAge,一般不需要手动操作,交由中间件

属性:

req.session.id // 保存唯一的会话id值,不可修改
req.session.cookie // 以键值对的形式保存cookie的原始数据
req.session.cookie.maxAge // 以毫秒的形式返回剩余存活时间
req.sessionID // 保存唯一的会话id,只读

demo:

const express = require('express')
const expressSession = require('express-session')

const app = new express()


// session middelware
app.use(expressSession({
	secret: 'blog', // cookie 签名,这个必须有
	saveUninitialized: true, // 是否自动初始化, 默认值为true
	resave: false, // 当用户session无变化时候依然自动保持
	cookie: {
		maxAge: 1800000, // 失效时长
	},
	rolling: true, // 每次请求是覆盖上次cookie
}))


// 登录
app.get('/login', function (req, res, next) {
	const id = req.query.id,
		  pwd = req.query.pwd;

	if(id && pwd) {
		if (userDb.has(id+pwd)) {
			req.send('该用户已登录')
		} else {
			req.session.userId = id+pwd;
			userDb.set(id+pwd, id);
			req.redirect('/')
		}
	} else {
		req.send('请输入正确的账号和密码')
	}
})

// 登出
app.get('/logout', function (req, res, next) {
	const userId = req.session.userId;
	req.session.destory((err) => {
		if (err !== userDb.has(userId)) {
			console.log('登场失败')
		} else {
			userDb.delete(userId);
			console.log('登出成功')
		}
	})
})

app.get('/', function (req, res, next) {
	if (req.session.userId && userDb.has(req.session.userId)) {
		res.send(`欢迎回来${userDb.get(req.session.userId)}`)
	} else {
		res.send(`未登录`)
	}
})

app.use((req, res) => {
	res.send('404 not found')
})

app.listen(8090, function() {
	console.log('start server')
})