这是我参与更文挑战的第16天,活动详情查看:更文挑战
在之前写的文章 Node系列学习之登录实现(一)中学习了在Node中解析, 设置Cookie,今天开始学习Node中设置session
Node学习系列的文章应该是每天学习后更新文章的, 但是端午前后比较累, 断更了两天, 非常惭愧!
好像坚持这个词离我已经很久远了…希望我能够把它重拾起来~
Session
- cookie的问题
- 可能暴露用户敏感信息
- 解决方法
- cookie中存储用户不敏感信息, server端设置session存储用户敏感信息
server端设置session
app.js
...
// 获取cookie过期时间
const getCookieExpires = () => {
const d = new Date()
d.setTime(d.getTime() + 24 * 60 * 60 * 1000)
return d.toGMTString()
}
...
// session数据
const SESSION_DATA = {}
...
// 解析cookie
req.cookie = {}
const cookieStr = req.headers.cookie || ''
cookieStr.split(';').forEach(item => {
if (!item) {
return
}
const arr = item.split('=')
const key = arr[0].trim()
const val = arr[1].trim()
req.cookie[key] = val
})
// 解析session
let neewSetCookie = false // 是否设置Set-Cookie, 默认为false
let userId = req.cookie.userId // 在cookie中获取userId
// 如果存在userId的话
if (userId) {
// SESSION_DATA[userId] 中有值的话,继续执行
if (!SESSION_DATA[userId]) { // 没有值的话 设置SESSION_DATA[userId] 为{}
SESSION_DATA[userId] = {}
}
} else { // 不存在userId
neewSetCookie = true // 更改neewSetCookie, 设置 Set-Cookie
userId = `${Date.now()}_${Math.random()}` // 暂时随机生成userId
SESSION_DATA[userId] = {} // 设置SESSION_DATA[userId] 为{}
}
req.session = SESSION_DATA[userId] // 复制给req.session
...
// 处理 blog 路由 新
const blogResult = handleBlogRouter(req, res)
if (blogResult) {
blogResult.then(blogData => {
// 路由处理完成后, 如果neewSetCookie为true时,设置Set-Cookie
if (neewSetCookie) {
res.setHeader('Set-Cookie', `userid=${userId}; path=/; httponly; expires=${getCookieExpires()}`)
}
res.end(JSON.stringify(blogData))
})
return
}
// 处理 user 路由
const userResult = handleUserRouter(req, res)
if (userResult) {
userResult.then(userData => {
console.log('neewSetCookie',neewSetCookie);
// 路由处理完成后, 如果neewSetCookie为true时,设置Set-Cookie
if (neewSetCookie) {
res.setHeader('Set-Cookie', `userid=${userId}; path=/; httponly; expires=${getCookieExpires()}`)
console.log(9);
}
res.end(JSON.stringify(userData))
})
return
}
复制代码
user.js
// 登录
if (method == 'POST' && req.path == '/api/user/login') {
const { username, password } = req.body
const result = login(username,password)
return result.then(data => {
if(data.username) {
// res.setHeader('Set-Cookie', `username=${data.username}; path=/; httponly; expires=${getCookieExpires()}`)
req.session.username = data.username
req.session.realname = data.realname
console.log('req.session', req.session);
return new SuccessModel()
}
return new ErrorModel('登录失败~')
})
}
// 登录验证的测试
if(method == 'GET' && req.path == '/api/user/login-test') {
if(req.session.username) {
return Promise.resolve(new SuccessModel({
session: req.session
}))
}
return Promise.resolve(new ErrorModel('尚未登录~'))
}
}
复制代码
session的问题
- 进程内存有限,访问量过大,内存会暴增
- 正式线上运行可能是多进程多机器的,进程之间无法共享
今天session学习完成, 学的有点浅, 感觉处理好逻辑就没啥事问题了,明天继续更新
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END