cookie, session,redis全解析
创始人
2024-04-29 17:18:32
0

cookie
session
redis

一. 前言

    最近在学习node的过程中对于cookie,session,redis有了和之前不一样的理解,记录一下之前不了解的知识点。

二.cookie的重点概念

  • 存储在客户端浏览器中的字符串,最大5kb
  • 跨域不共享,每一个域下的cookie都是不同的
  • 由于字符串是非结构化的数据,为了存储结构化数据约定以 k1=v1;k2=v2;k3=v3格式来存储
  • 每次发送一个http请求的时候(无论是请求网页,请求js,请求图片)都会携带请求域的cookie发送给server端(请求域:例如在tb的界面请求百度的页面,则请求域为百度,把百度的cookie发送给server,而不是把tb的cookie发送到百度的server)
  • server端可以修改cookie返回给客户端,浏览器也可以通过js修改cookie传给server端,但是这里的修改是有限制的(server端有时候需要锁死一段cookie,不让js去修改)

    浏览器查看cookie的三种方式:

    • 请求发送以后在request中查看cookie,也可在response中查看set-cookie
    • 控制台的application中的storage中查看cookie
    • 在控制台打印document.cookie可以打印出cookie(有限制的,若server端设置某cookie值为httpOnly,则无法通过脚本查看这部分被限制的cookie值,因此查看cookie时第三种方法和上述两种方法相比,得到的结果是有差异的,数据有可能是少的)

    node读取cookie

    const cookieStr=req.headers.cookie
    //cookieStr是一个字符串,格式为k1=v1;k2=v2
    //解析cookie
    req.cookie={}
    cookieStr.split(";").forEach(item=>{const arr=item.split("=")const key=arr[0]const value=arr[1]req.cookie[key]=value
    })
    

    node写入cookie

    res.setHeader("Set-Cookie",`username=${username};path=/`
    

    这里的path=/很重要,如果不写,路由变化以后cookie是无效的

    对cookie做出限制

    如果不对cookie做限制,那么前端就可以用js脚本任意修改cookie的值,假如用其他人的信息随意更改本人的登录信息会造成严重的后果,因此需要对cookie做出限制
    res.setHeader('Set-Cookie',`username=${username};path=/;httpOnly`
    

    在代码中加入httpOnly以后发现一个问题:正常请求接口后端写入cookie以后,前端在浏览器控制台使用document.cookie追加同样的key值时没有被后端写入的值覆盖,而是在当前cookie追加了写入的值,这显然不符合httpOnly应该起的作用。
    最后打印了一下这里的key,value值,发现key值前面自动追加了一个空格

    const key=arr[0]
    const value=arr[1]
    

    这里需要注意的是我们每次用document.cookie去追加cookie的时候默认会在追加值前面加一个空格,例如
    Cookie: username=lisi; username=zhangsan
    所以username和(空格)username是不一样的,无法用server端写入的值去覆盖前端写入的值,因此在解析cookie的时候需要对空格做一下处理

    cookieStr.split(";").forEach(item=>{const arr=item.split("=")const key=arr[0].trim()const value=arr[1].trim()req.cookie[key]=value
    })
    

    三.从cookie到session

    之所以有session这个概念,肯定是因为cookie暴露出了一些问题
    • 如果登录的时候我们直接通过cookie传递username或者一些用户的个人信息是非常危险的,因此我们需要一个映射关系,在cookie中用一个用户标识id(可以是一个随机数)映射到后端真正存储的用户信息
    • cookie是有大小限制的,以kb为单位,不能存储过多的用户信息
    因此我们使用session来解决上述的问题

    四.从普通js对象存储session到redis存储

    cpu,内存,进程
    redis缓存数据库,放在内存中
    优点:访问快
    内存:贵,存储少,断电丢失

    mysql:硬盘数据库

    webserver----》redis,mysql
    为什么要把session存放在redis里面,而不是放在mysql里面?
    1.处理seesion的操作是在入口文件,每次程序进来都会先读取这块的代码,是非常频繁的;而mysql数据里面的增删改查是后置操作,什么时候用什么时候触发
    2.sessio不考虑断电丢失的问题,丢了重新登录就行
    3.session存储的数据量不是很大

    Mac安装redis
    brew install redis
    启动redis
    redis-server,成功以后就会有这个图
    在这里插入图片描述

    redis-cli
    在这里插入图片描述

    redis基本使用就是set和get
    在这里插入图片描述

    还有keys *可以看到所有设置的keys值
    del myname:删除myname的值
    在这里插入图片描述

    如果遇到以下错误:
    在这里插入图片描述

    说明该进程已经占用了6379这个端口,因此无法使用redis-server启动redis,解决的方法如下:

    ps -ef | grep redis
    

    在控制台输入上述命令行可以查看目前正在被占用的端口进程:
    在这里插入图片描述

    看到6379这个端口进程为67496,如果需要继续使用这个进程,则直接在控制台输入:

    redis-cli
    

    如果不想再占用这个端口,则需要杀死这个进程:

    kill -9 -67496
    

    在这里插入图片描述

    可以看到杀完进程以后6379端口没有再占用
    此时在控制台输入 redis-server,就会出现上面那张成功的图片

    相关内容

    热门资讯

    安卓系统和linux系统的区别... 你有没有想过,为什么你的手机里装的是安卓系统而不是Linux系统呢?这两者虽然听起来都挺高大上的,但...
    小米4安卓系统几代,引领科技潮... 你有没有想过,你的手机里那个小小的操作系统,其实就像是一个默默无闻的超级英雄呢?今天,咱们就来聊聊小...
    安卓系统里的SE,功能与操作指... 你有没有发现,安卓系统里有个叫SE的小家伙?别小看了它,这个小家伙可是隐藏着不少秘密呢!今天,就让我...
    手机系统flyme是安卓系统吗... 你有没有想过,你的手机里那个飞快如风的系统,Flyme,它是不是安卓的“好兄弟”呢?今天,就让我带你...
    安卓os系统怎么使用,Andr... 你手里那台安卓手机是不是总感觉有点儿复杂,不知道怎么玩转呢?别急,今天就来给你详细介绍一下安卓OS系...
    安卓怎么装旧系统,安卓设备如何... 你有没有想过,手机用久了,系统更新换代,新功能层出不穷,但有时候,那些旧系统里的经典操作和熟悉感,简...
    电脑怎装安卓系统,轻松实现多系... 你有没有想过,你的电脑除了装Windows系统,还能装上安卓系统呢?没错,就是那个让你手机不离手的安...
    安卓系统找不到软件,探寻解决方... 最近是不是你也遇到了这样的烦恼:手机里明明有安卓系统,却怎么也找不到心仪的软件?别急,今天就来给你详...
    小米独立系统取代安卓,迈向自主... 小米独立系统:小米与安卓的较量在科技领域,每一次系统的更新换代都牵动着无数科技爱好者和行业从业者的目...
    安卓系统会员价格,性价比与权益... 你有没有发现,最近手机上的安卓系统会员价格又涨了?这可真是让人有点头疼呢!咱们一起来聊聊这个话题,看...
    安卓点歌系统怎么点歌,享受音乐... 你有没有想过,在安卓手机上点歌竟然也能这么有趣呢?没错,现在就让我带你一起探索安卓点歌系统的奥秘吧!...
    w222安卓系统,功能解析与使... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那款备受瞩目的W222安卓系统!...
    iphone手机使用安卓系统,... 你有没有想过,如果有一天你的iPhone手机突然变成了安卓系统,会是怎样的场景呢?想象那熟悉的苹果界...
    安卓系统珠宝手绘软件,艺术与科... 你有没有想过,手机上那些精美的珠宝手绘作品是怎么诞生的呢?其实,这一切都离不开安卓系统上一款神奇的应...
    安卓系统app签名方案,安全与... 你有没有想过,为什么你的手机上那么多应用都能无缝运行?这其中,安卓系统app签名方案可是功不可没哦!...
    安卓系统关闭应用存储,释放手机... 手机里的应用越来越多,存储空间越来越紧张,是不是感觉手机像是个装满杂物的仓库?别急,今天就来教你怎么...
    安卓系统的占比,引领移动设备市... 你知道吗?在智能手机的世界里,有一个系统可是占据了半壁江山,那就是安卓系统!想象你手中的手机,是不是...
    在线安卓翻译系统实现,便捷跨语... 你有没有想过,在这个信息爆炸的时代,语言不再是沟通的障碍?没错,我要说的是,在线安卓翻译系统正在悄悄...
    安卓系统适配键盘丝印,打造个性... 你有没有发现,用安卓手机打字的时候,有时候键盘上的字母会变得模糊不清,甚至有时候还会出现错别字呢?这...
    车载安装安卓系统教程,轻松实现... 你有没有想过给你的爱车来个“大变身”?没错,就是给车载系统来个升级,让它从那个老旧的界面跳脱出来,变...