node.js原生开发服务端项目之使用redis存储session信息实现登录

const http = require('http')
const querystring = require('querystring')
const redis = require('redis')

const getCookieExpires = () => {
  const d = new Date()
  d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
  return d.toGMTString()
}

const redisClient = redis.createClient(6379, '127.0.0.1')

redisClient.on("error", function(error) {
  console.error(error);
});

function set(key, val) {
  if(typeof val === 'object'){
    val = JSON.stringify(val)
  }

  redisClient.set(key, val, redis.print)
}

function get(key) {
  return new Promise((resolve, reject) => {
    redisClient.get(key, (err, val) => {
      if(err){
        reject(err)
        return
      }
      if(val === null){
        resolve(null)
        return
      }
      try{
        resolve(JSON.parse(val))
      } catch (e) {
        resolve(val)
      }
    })
  })
}


const server = http.createServer(async (req, res) => {

  res.setHeader('Content-type', 'application/json')

  const url = req.url
  req.path = url.split('?')[0]
  req.query = querystring.parse(url.split('?')[1])

  req.cookie = {}
  const cookie = req.headers.cookie || ''
  cookie && cookie.split(';').forEach(item => {
    const arr = item.split('=')
    const key = arr[0].trim()
    req.cookie[key] = arr[1].trim()
  })

  let sessionId = req.cookie.sessionId
  if(!sessionId){
    sessionId = `${Date.now()}_${Math.random()}`
    res.setHeader('Set-Cookie', `sessionId=${sessionId};path=/;httpOnly;expires=${getCookieExpires()}`)
    set(sessionId, {})
  }

  req.sessionId = sessionId

  const sessionData = await get(req.sessionId)
  if(sessionData === null){
    set(req.sessionId, {})
    req.session = {}
  } else {
    req.session = sessionData
  }

  if(req.method === 'GET' && req.path === '/login'){
    const { username, password } = req.query
    if(username === 'test' && password === '123'){
      req.session.username = 'test'
      req.session.password = '123'
      // 同步到redis
      set(req.sessionId, req.session)
      res.end('login success')
    } else {
      res.end('login fail')
    }
    return
  }

  if(req.method === 'GET' && req.path === '/getUserInfo'){
    if(req.session.username){
      res.end(JSON.stringify({ username: req.session.username, password: req.session.password }))
    } else {
      res.end('not login')
    }
    return
  }

  res.writeHead(404, { "Content-type": "text/plain" })
  res.write("404 Not Found\n")
  res.end()
})


server.listen(8002)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值