Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

express express-session 中间件 #6

Open
gaowei1012 opened this issue Jan 25, 2019 · 0 comments
Open

express express-session 中间件 #6

gaowei1012 opened this issue Jan 25, 2019 · 0 comments

Comments

@gaowei1012
Copy link
Owner

gaowei1012 commented Jan 25, 2019

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')
})
@gaowei1012 gaowei1012 changed the title express cookie-session 中间件 express express-session 中间件 Jan 25, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant