cookie, session,redis全解析

news2024/11/20 13:19:22

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,就会出现上面那张成功的图片

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110484.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    限定城市|临床医生自费赴日本大阪公立大学医学院访学观摩

    X医生拟自费访学,目标是日本大阪都市圈,包括大阪、京都、奈良、神户等,优先考虑大阪市及京都市。最终我们申请到大阪公立大学医学院,对方在一周内连续发来两封邀请函,以便于X医生办理护照及单位的审批手续。对于首次办…

    Zabbix与乐维监控对比分析(五)——可视化篇

    前面我们详细介绍了Zabbix与乐维监控的架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理方面的对比分析,相信大家对二者的对比分析有了相对深入的了解,接下来我们将对二者的可视化功能进行对比分析。可视化是当代IT监控的一个创举&#x…

    java+ssh+mysql客户关系管理系统

    项目介绍: 本系统为基于jspsshmysql的客户关系管理系统,系统实现了权限自动化,可以自由创建角色,并为每个角色赋予权限,全部功能如下: 1.我的桌面:列出了一些办公常用快捷方式 2.信息中心&am…

    CSDN第17次竞赛题解与总结

    前言 临近期末考,博主时间较少,本文质量可能不高,请见谅。 2022/12/21 19:00~21:00 CSDN第17次竞赛开考 本场竞赛由「清华大学出版社 & CSDN」联合主办。 《算法竞赛》 本书解析了算法竞赛考核的数据结构、算法;组织了每个…

    Python基础库及机器学习笔记

    1.介绍 本节将主要介绍Python中的常用第三方库。这些库都是实现了各种计算功能的开源库,它们极大地丰富了Python的应用场景和计算能力,这里主要介绍NumPy、pandas和Matplotlib三个库的基础使用。其中NumPy是Python用来进行矩阵运算、高维度数组运算的数…

    jQuery Ajax

    文章目录jQuery Ajax概述load()简单使用加载部分内容传递数据回调函数$.get()$.post()$.getJSON()$.getScript()jQuery Ajax 概述 Ajax,全称“Asynchronous JavaScript and XML”,即“异步的JavaScript和XML”。其核心是通过JavaScript的XMLHttpReques…

    分布式开源工作流引擎有什么特点?

    在竞争越来越激烈的社会中,拥有提质增效的办公软件,可以为企业带来更可观的市场价值。分布式开源工作流引擎在企业数字化发展进程中深受欢迎,在帮助企业提升办公效率上发挥了重要的作用。今天,我们就一起里盘点下分布式开源工作流…

    【轻松掌握C语言】程序环境和预处理

    目录 一、程序的翻译和执行环境 1、翻译环境 2、执行环境 二、预处理详解 1、预定义符号 2、#define 3、#undef 4、命令行定义 5、条件编译 6、文件包含 一、程序的翻译和执行环境 1、翻译环境,在这个环境中源代码被转换为可执行的机器指令。 2、执行环境&#xff0…

    笔记本怎么录制屏幕?只需2分钟,快速学会

    如今,大多数人会在笔记本电脑上使用屏幕录制功能,如:在线直播课程、在线会议、电影和电视剧等场景。笔记本怎么录制屏幕?事实上,用电脑录制视频并不像你想象的那么困难。我们每天使用的电脑都有自己的屏幕录制功能&…

    高性能数据分析时代,HPDA平台需要什么样的数据存储?

    在海量基因数据中进行全基因数据分析,了解各种疾病与DNA之间的隐秘联系;对海洋气候进行预测,利用强大的数据分析性能,实现分钟级的数据刷新、精准预测海洋气候;利用高速相机模拟人脑上亿个神经元之间联接与工作&#x…

    善康医药冲刺科创板上市:计划募资13亿元,上半年亏损5000万元

    近日,深圳善康医药科技股份有限公司(下称“善康医药”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,善康医药计划募资13.27亿元,将用于新药研发项目、创新药高端制剂生产基地建设项目、营销…

    redis学习第二天

    Redis事务 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令插队。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、discard 从输入Multi命令开始、…

    【c++基础】第六章 STL标准模板库

    第六章 STL标准模板库认识STLstring字符容器库vector容器迭代器与空间配置器deque容器容器适配置list容器set容器map容器观察者设计模型认识STL STL的概述 STL采用泛型思想,把C中所用到的所有的数据结构,按照一定的标准,全部封装成了一个个…

    虚拟机docker网络问题处理

    问题 我们有2台设备,ip 为 172.20.30.1 172.20.30.2 ,虚拟机上的服务需要连接这2台设备,网络已经做通了,可以正常连接虚拟机异常关闭,重新开启后。发现服务有些问题,就打算将docker服务重新部署&#xff0…

    Vue后台项目的记录 (一)

    一、下载模板 简洁版: https://github.com/PanJiaChen/vue-admin-template 下载下来的文件介绍 build ----index.js webpack配置文件【很少修改这个文件】 mock ----mock数据的文件夹【模拟一些假的数据mockjs实现的】,因为咱们实际开发的时候,利用的是…

    STM32——FATFS文件系统

    可裁剪意味着可以选择部分功能,减小占用的空间。 与Windows兼容意味着可以在电脑上直接读取文件。 ①底层接口,包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储…

    深度学习笔记(1)| 导数、偏导数、梯度和方向导数的理解

    1. 梯度(Gradient)的理解 深度学习尝试在权重空间中找到一个方向,沿着该方向能降低损失函数的损失值。其实不需要随机寻找方向,因为可以直接计算出最好的方向,这就是从数学上计算出最陡峭的方向。这个方向就是损失函数…

    单页扒手-基于Node的实现

    做网站的朋友经常遇见别人的好看的页面,想保存到本地自己用,可是用以前的老办法网页另存为,发现很不好,规则不好处理,路径也不好处理,用这个网页克隆(单页模板扒手)就很好处理了&…

    阿里「杀手锏」级语音识别模型来了!推理效率较传统模型提升10倍,已开源

    阿里达摩院,又搞事儿了。 这两天,它们发布了一个全新的语音识别模型: Paraformer。 开发人员直言不讳:这是我们“杀手锏”级的作品。 ——不仅识别准确率“屠榜”几大权威数据集,一路SOTA,推理效率上相比…

    Zookeeper 4 Zookeeper JavaAPI 操作 4.7 Curator API 常用操作【Watch 事件监听】

    Zookeeper 【黑马程序员Zookeeper视频教程,快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.7 Curator API 常用操作4.7.1 Watch 事件监听4 Zookeeper JavaAPI 操作 4.7 Curator API 常用操作 4.7.1 Watch 事件监听 【基本概念】 ZooKeep…