Node系列学习之登录实现(二)

这是我参与更文挑战的第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
喜欢就支持一下吧
点赞0 分享