cookies和session的理解

博主的博客项目做的差不多了,觉得该总结一下一些基本概念避免遗忘
首先理清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]`

大致整理了一下,后续可能还会再丰富修改

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值