Node.js用户登录:从cookie到session到redis

前言

当用户登录之后,需要标识用户的登录信息,用户在做其他操作的时候,比如电商系统中的添加购物车的功能,博客系统中的新建博客等都需要用户登录之后才可以操作,那如何才能标识用户已经登录呢?

cookie

cookie是存储在浏览器的一般字符串,最大5kb。

特点:

①存储在浏览器中
②跨域不共享
③存储格式:k1=v1;k2=v2,可以存储结构化数据
④每次发送http请求,会将请求域中的cookie一起发送给server
⑤server可以修改cookie并返回给浏览器
⑥浏览器也可以通过js修改cookie

浏览器查看cookie的方式

①F12中的Request Headers中的Cookie
Application中的Cookies
Console中输入document.cookie

Node.js操作cookie

app.js中解析cookie

// 解析cookie
req.cookie = {}
const cookieStr = req.headers.cookie || ''
cookieStr.split(';').forEach(item => {
  if (!item) {
    return
  }
  const arr = item.split('=')
  const key = arr[0]
  const val = arr[1]
  req.cookie[key] = val
})

user.js中设置cookie

res.setHeader('Set-Cookie', `username=${data.username}; path=/; httpOnly; expires=${getCookieExpires()}`)

data.name 是界面中的一个变量
path=/ 根路由
httpOnly 不允许前端修改cookie
expires设置过期时间,getCookieExpires是界面中的一个函数,获取下一天的时间

// 获取cookie的过期时间
const getCookieExpires = () => {
  const d = new Date()
  d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
  return d.toGMTString()
}

cookie的问题

①会暴露username等用户信息,较危险
②如果存储的内容过大,会放不下

session

session是存储在服务器端,所以没有容量限制。通常在客户端存储一个userid(标识),服务器端存储对应的用户信息。

Node.js操作session

app.js中解析session

// session 数据
const SESSION_DATA = {}

// 解析session
let needSetCookie = false
let userId = req.cookie.userid
if (userId) {
  if (!SESSION_DATA[userId]) {
    SESSION_DATA[userId] = {}
  }
} else {
  needSetCookie = true
  userId = `${Date.now()}_${Math.random()}`
  SESSION_DATA[userId] = {}
}
req.session = SESSION_DATA[userId]

user.js中设置session

// data是SQL查出来的结果,把结果存储到session中
req.session.username = data.username

session的问题

①目前session是js变量,放到node.js进程内存中,进程内存有限,访问内容有限会导致内存暴增
②如果线上多进程的话,进程之间内容无法共享

redis

一个缓存数据库,数据存放在内存中,访问速度快,成本高,可存储数据量小

为什么session使用redis呢

①session访问频繁,对性能要求高
②可以不考虑断电丢失数据的问题
③数据量不会太大

redis使用方式

①npm下载redis
②创建客户端

// 引入redis
const redis = require('redis')

// 创建客户端
const redisClient = redis.createClient(端口号, 'ip地址')
redisClient.on('error', err => {
  console.error(err);
})

// 测试
redisClient.set('myname', 'helen1', redis.print)
redisClient.get('myname', (err, val) => {
  if (err) {
    console.error(err);
    return
  }
  console.log('val', val);
  // 退出
  redisClient.quit()
})

小结

从cookie到session到redis,是一个不断优化的过程,cookie容量小且不安全所以有了session,但session无法实现内容共享,所以又使用了redis。不断更新的过程就是不断成长的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值