前言
当用户登录之后,需要标识用户的登录信息,用户在做其他操作的时候,比如电商系统中的添加购物车的功能,博客系统中的新建博客等都需要用户登录之后才可以操作,那如何才能标识用户已经登录呢?
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。不断更新的过程就是不断成长的过程。