博主的博客项目做的差不多了,觉得该总结一下一些基本概念避免遗忘
首先理清cookie和session。因为我的博客有登录功能所以用到了cookie,但是因为cookie并不安全,业内的统一解决方案是引入session
理解Cookie(headers)
cookie是存储在浏览器的一串字符串 (最大5kb)
cookie有跨域不共享的特性,浏览器为每个域名分别存储一段域名
cookie的格式如 K1-v1;K2=v2;K3=v3; 因此可以存储结构化数据
每次发送http请求,会将请求域的cookie一起发送给server
server端可以修改cookie并返回给浏览器
浏览器(Client)也可以通过javaScrip修改cookie(有限制,可以在server端进行限制)
如下图
浏览器(Client端)操作cookie
以chrome为例
查看cookie
未解析的:network > ALL > headers responseheaders requestheaders
解析后的:Application > Storage > Cookies Name cookie的名字,Value:cookie的值,Domain:cookie生效的域名,path:cookie生效的路径,expires:cookie的有效期,size:cookie的大小
用js修改cookie 在浏览器控制台中,Console中
查看cookies:document.cookie
累加cookies:document.cookie=‘K2=v1’
并不能修改删除,只能累加
server端操作cookie
查看cookie
修改cookie
两者就可以实现登录验证
解析cookie
//解析cookies
req.cookie = {} //定义一个req.cookies为空值
const cookieStr = req.headers.cookie || ''
cookieStr.split(';').forEach(item => { //通过分号拆分数组,并进行遍历
if(!item) { //如果item的值不存在
return //return结束,return是终止符
}
const arr = item.split('=') //通过等号把K1=V1拆分成数组
const key = arr[0].trim() //key是等号前面那个值
const val = arr[1].trim() //val是等号后面那个值
req.cookie[key] = val //把key的值赋值为val
})
console.log('req.cookie is',req.cookie) // {name:lisi}
操作cookie
res.setHeader('set-Cookie',`userid=${userId};path=/;httpOnly;expires=${getCookieExpires()}`)
//path=/:设置生效路径为根目录
//httpOnly: 设置只允许后端修改
//expires=:设置生效时间期限
.
.
理解session
sesion可以弥补cookie的缺陷
单纯cookie的缺陷
会暴露信息(如用户名,登录密码) 非常危险
解决办法:
server端的session存储用户信息,cookie只存储userid来到session中取用
如cookie 》userid, server》username
//设置sesson空对象
const SESSION_DATA= {}
//解析session
let needSetCookie = false //默认判断需要验证
let userId = req.cookie.userid
if(userId){
if(!SESSION_DATA[userId]) {//如果SESSION_DATA没有这个userid就初始化一个对象
SESSION_DATA[userId] = {}
}
} else{
needSetCookie = true
userId= `${Date.now()}_${Math.random()}`
SESSION_DATA[userId] = {}
}
req.session = SESSION_DATA[userId]`
大致整理了一下,后续可能还会再丰富修改