Cookie与Session知识

目录

一.Cookie与Session的发展史

1.Cookie的发展史

2.Session的发展史

3.Cookie和Session的关系

4.总结

二.Cookie与Session详解

1.Cookie

2.Session

3.token

4.总结

三.Django操作Cookie

1.设置Cookie

2.获取Cookie

3.设置超时时间

4.注销Cookie

5.登录功能实现

(1.0)简单实现

(2.0)解决登录问题

(3.0)迭代-登录认证装饰器

四.Django操作Session

1.设置Session

2.获取Session

3.设置/获取Session多个值

4.django_session表中的session数据

5.设置过期时间

6.清空session

(1)request.session.delete():

(2)request.session.flush():

7.保存

原理剖析

案例演示

(1.0)简单的

(2.0)解决方法

(3.0)优化


一.Cookie与Session的发展史

Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术

1.Cookie的发展史

  1. 1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户在网站上的活动。
  2. 初始版本的Cookie只能存储很少的数据,并且没有强制加密机制,容易被恶意用户篡改或窃取。因此,随着互联网的快速发展,Cookie引起了一系列安全和隐私问题。

2.Session的发展史

  1. 由于Cookie存在的局限性,Web开发人员开始寻找更安全、可靠的替代方案。1997年,Sun Microsystems提出了基于服务器的会话管理方案,即Session。
  2. Session是在服务器端存储用户会话数据的一种技术。每当用户访问网站时,服务器会为其创建一个唯一的Session标识符(Session ID),并将会话数据存储在服务器上。
  3. Session ID一般通过Cookie或URL参数传递给客户端,用于识别用户的会话状态。

3.Cookie和Session的关系

  1. 在实际应用中,Cookie和Session通常结合使用。当用户首次访问网站时,服务器会为其分配一个唯一的Session ID,并将其存储在Cookie中,发送给客户端保存。
  2. 随后,客户端在每次请求中都会携带该Cookie,服务器通过解析Cookie中的Session ID,读取对应的会话数据,实现用户状态的跟踪和管理。

4.总结

Cookie和Session是Web应用程序中常用的用户会话跟踪技术

Cookie通过在客户端存储小型文本文件,并将会话标识符传递给服务器,实现会话状态的保持

Session则是在服务器端存储会话数据,通过Session ID实现对用户会话的追踪

他们的发展历程与互联网的发展紧密相关,为开发人员提供了更多的选择以保障安全性和用户体验的提升

二.Cookie与Session详解

以登录功能为例:

        如果不保存用户登录状态也就意味着用户每次访问网站都需要重复的输入用户名和密码

        这对用户来说体验极差

解决方法:

        当用户第一次登录成功之后将用户的用户名和密码返回给浏览器,让用户浏览器保存在本地

        之后访问网站的时候浏览器自动将保存在本地的用户名和密码发送给服务端,服务端获取之后自动验证,但是具有极大的安全隐患

优化:

        当用户登录成功之后,服务端产生一个随机字符串(在服务端保存数据,用K:V键值对的形式),交由客户端浏览器保存

        之后访问服务端时都带着随机字符串,服务端去数据库中比对是否有匹配到的随机字符串,从而获得用户信息

        但是如果截取到当前随机字符串,那么就可以冒充当前用户,其实还是有极大的安全隐患

        在web领域没有绝对的安全和绝对的不安全

1.Cookie

  • 服务器保存在客户端浏览器上的信息都可以称之为cookie
  • 它的表现形式一般都是K:V键值对(可以有多个)

2.Session

  • 保存在服务器上的信息都可以称之为session
  • 它的表现形式一般都是K:V键值对(可以有多个)

3.token

  • session虽然数据是保存在服务端的,但是挡不住数据量大
  • 解决办法:服务端不再保存数据
    • 登录成功之后将一段信息加密处理(用自己独特的加密方式进行加密)
  • 将加密之后的结果拼接在信息后面,整体返回给浏览器保存
  • 浏览器下次访问的时候带着该信息,服务端自动切取前面的一段信息再次使用自己的加密算法进行加密
  • 然后用这段密文与携带过来的密文进行比对

4.总结

  • cookie就是保存在客户端浏览器上的信息
  • session就算保存在服务端上的信息
  • session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用cookie)

三.Django操作Cookie

虽然Cookie是服务端告诉客户端浏览器需要保存内容,但是客户端浏览器可以选择拒绝保存,如果禁止自动保存Cookie那么只要是需要登录的网站都没办法正常登录了

  • 视图函数的返回值
return HttpResponse()
return render()
return redirect()
  • 变形
obj = HttpResponse()
return objobj1 = render()
return obj1obj2 = redirect()
return obj2

如果想要操作Cookie,必须进行以上变形才可以

1.设置Cookie

obj = HttpResponse()
obj.set_cookie(key,value)
return obj

2.获取Cookie

request.COOKIES.get(key)

3.设置超时时间

obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 设置超时时间 5s 到期
return obj
  • max_age
    • 设置超时时间,以秒为单位
  • expiress
    • 设置超时时间,针对IE浏览器使用,以秒为单位

4.注销Cookie

obj = HttpResponse()
# 设置超时时间 5s 到期
obj.delete_cookie(key)
return obj

5.登录功能实现

(1.0)简单实现

  • 路由
urlpatterns = [path('admin/', admin.site.urls),path('login/', views.login),path('home/', views.home),
]
  •  视图
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 登陆成功之后,跳转到登陆成功之后才能看到的页面return redirect('/home/')return render(request, 'login.html')def home(request):return HttpResponse("登陆成功!")
  • 前端
<form action="" method="post"><p>username:<input type="text" name="username" class="form-control"></p><p>password:<input type="password" name="password" class="form-control"></p><input type="submit" class="btn btn-success">
</form>

问题:登录成功之后的跳转页面,不需要登录也可以直接访问到,只需要给对应的地址即可

(2.0)解决登录问题

from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 登陆成功之后,保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookieobj.set_cookie("sign", "1314521")'''浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie'''# 登陆成功之后,跳转到登陆成功之后才能看到的页面return objreturn render(request, 'login.html')def home(request):# 读取携带的cookie,cookie正确登陆成功if request.COOKIES.get("sign") == "1314521":return HttpResponse("登陆成功!")# 读取携带的cookie,cookie不正确跳转到登陆页面return redirect('/login/')

(3.0)迭代-登录认证装饰器

用户如果没有登录的情况下想访问一个需要登录的页面,那么先跳转到登录页面,当用户输入正确的用户名和密码之后再跳转到用户之前想访问的页面去,而不是直接写死

from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 获取用户上一次想要访问的url# 结果可能为空 -- 直接访问logintag_url = request.GET.get('tag_url')if tag_url:obj = redirect(tag_url)else:# 登陆成功之后,保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookieobj.set_cookie("sign", "1314521")'''浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie'''# 登陆成功之后,跳转到登陆成功之后才能看到的页面return objreturn render(request, 'login.html')# 校验用户登录状态的装饰器
def auth_check(func):def inner(request, *args, **kwargs):# 获取到用户上一次想要访问的urltag_url = request.get_full_path()# 读取携带的cookie,cookie正确登陆成功if request.COOKIES.get("sign") == "1314521":res = func(request, *args, **kwargs)return reselse:# 读取携带的cookie,cookie不正确跳转到登陆页面return redirect(f'/login/?next={tag_url}')return inner@auth_check
def home(request):return HttpResponse("home登陆成功!")@auth_check
def index(request):return HttpResponse("index登陆成功!")@auth_check
def func(request):return HttpResponse("func登陆成功!")

四.Django操作Session

Session数据是保存在服务端的,给客户端返回的是一个随机字符串

1.设置Session

request.session['key'] = value

2.获取Session

request.session.get('key')

3.设置/获取Session多个值

  • 给session设置多个值的时候存在数据库中的数据仍是一条
  • 但是在取session的时候,可以通过request.session对象获取到设置的多组键值对

4.django_session表中的session数据

  • django_session表中的数据条取决于浏览器
    • 同一个计算器(IP地址)上同一个浏览器只会有一条数据失效
    • 同一个计算器(IP地址)上多个浏览器会有多个数据生效
    • 当session过期的时候可能会出现多条数据对应一个浏览器
      • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
  • 目的是为了节省服务器数据库资源

5.设置过期时间

# 设置session
request.session['key'] = value
# 设置过期时间
request.session.set_expiry()
  • 参数
    • 整数
      • 多少秒过期
    • 日期对象
      • 到指定日期失效
    • 0
      • 一旦退出当前浏览器窗口就失效
    • 不写
      • 失效时间取决于Django内部全局session失效的时间

6.清空session

(1)request.session.delete():

只删除服务端的


该方法用于删除当前用户的Session数据,但是会保留Session的Key,这意味着Session对象本身仍然存在,但其中的数据将被清空,下次访问时,如果Session没有被重新填充则会得到一个空的Session对象

def clear_session(request):request.session.delete()# 其他操作或返回响应

​​​​​​​(2)request.session.flush():

服务端和客户端都删除


该方法用于完全删除当前用户的Session,包括Session对象的所有相关数据,下次访问时将创建一个新的空Session对象

def clear_session(request):request.session.flush()# 其他操作或返回响应

7.保存

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

原理剖析

  • *request*.session['sign'] = '369'内部发生了哪些事
    • Django内部会自动帮我们生成一个随机字符串
    • Django自动将随机字符串和对应的数据存储到django_session表中
      • 先在内存中产生操作数据的内存
      • 在响应经过Django中间件的时候才去操作数据库
    • 将产生的随机字符串返回给客户端浏览器保存
  • request.session.get('sign')内部发生了哪些事
    • 自动从浏览器中获取sessionid对应的随机字符串
    • 根据该随机字符串去django_session表中查找对应的数据
      • 如果匹配成功,则将对应的数据取出并以字典的形式封装到request.session中
      • 如果匹配不成功,则request.session中的数据为None

案例演示

(1.0)简单的
  • 路由
# session操作
path('set_session/', views.set_session),
  • 视图
def set_session(request):request.session['sign'] = "369"return HttpResponse("返回消息")
  • 会报错
OperationalError at /set_session/
no such table: django_session
  • 数据是保存在服务端的
    • 在默认情况下操作session的时候需要Django默认的一张django_session表
  • 数据库迁移命令时
    • Django会默认创建很多表,其中就有Django_session表
  • Django默认session的过期时间是14天
    • 但是我们可以人为的修改过期时间
(2.0)解决方法
  • 先进行数据库迁移命令
    • 再进行访问
    • session会自动保存到django_session表中
(3.0)优化
  • 路由
# session操作
path('set_session/', views.set_session),
path('get_session/', views.get_session),
  • 视图
def set_session(request):request.session['sign'] = "369"return HttpResponse("返回消息")def get_session(request):request.session.get("sign")return HttpResponse("拿取成功消息")

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

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

相关文章

【机器学习】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是对On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中两个结构稀疏假设的总结。原文链接在Reference中。 什么是ICA(Independent component analysis)&#xff1f; 独立成分分析简单来说&#xff0c;就是给定很多的样本X&#xff0c;通…

Springboot-热部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

C++ DAY08 异常

概念 异常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在 , 空指针&#xff0c;内存不足 等等&#xff09; 在 C 语言对错误的处理是两种方法&#xff1a; 一是使用整型的返回值标识错误&#xff1b; 二是使用 errn…

自动解决IP冲突的问题 利用批处理更改末位IP循环+1直到网络畅通为止 解放双手 事半功倍

好久没出来写点什么了&#xff0c;难道今天有点时间&#xff0c;顺便把这两天碰到的问题出个解决方法吧。 这几天去客户那儿解决网络问题&#xff0c;因为客户的网络是固定的静态IP&#xff0c;因为没做MAC绑定&#xff0c;IP固定在本地电脑上&#xff0c;只要上不了网&#xf…

PDF转Word,1行Python代码就够了,免费用

大家好&#xff0c;这里是程序员晚枫。 今年十一假期没出去旅游&#xff0c;在家里更新一套原创课程&#xff0c;&#x1f449;给小白的《50讲Python自动化办公》。 所有功能&#xff0c;都只需要1行代码&#xff0c;非常适合非程序员入门Python使用。 目前全网播放量直逼100…

RK3588平台开发系列讲解(嵌入式AI篇)RKNPU详解

文章目录 一、CPU、GPU、FPGA和NPU介绍二、CPU、GPU、FPGA和NPU区别三、NPU 应用四、RKNPU沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍什么是RKNPU。 一、CPU、GPU、FPGA和NPU介绍 二、CPU、GPU、FPGA和NPU区别 若考虑成本、功耗、计算能力以及体…

探秘开发app与小程序:一场技术与创新的博弈

app与小程序&#xff1a;一场技术与创新的博弈随着科技的飞速发展&#xff0c;移动应用程序已经成为我们日常生活中不可或缺的一部分。在这个充满竞争的时代&#xff0c;企业纷纷投身于开发各类移动应用&#xff0c;以期在市场中占据一席之地。然而&#xff0c;面对多样化的应用…

PC访问华为昇腾开发板的摸索过程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近要折腾华为昇腾开发板&#xff08;官方名称叫&#xff1a;Atlas 200I DK&#xff09;。先是按照官方教程折腾&#xff1a;Atlas200DK环境部署。我发现…

Spark---转换算子、行动算子、持久化算子

一、转换算子和行动算子 1、Transformations转换算子 1&#xff09;、概念 Transformations类算子是一类算子&#xff08;函数&#xff09;叫做转换算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延迟执行&#xff0c;也叫懒加载执行。 2)、Transf…

Jina AI 的 8K 向量模型上线 AWS Marketplace,支持本地部署!

在当前多模态 AI 和大模型技术风头正劲的背景下&#xff0c;Jina AI 始终领跑于创新前沿&#xff0c;技术领先。2023 年 10 月 30 日&#xff0c;Jina AI 隆重推出 jina-embeddings-v2&#xff0c;这是全球首款支持 8192 输入长度的开源向量大模型&#xff0c;其性能媲美 OpenA…

汇编-PROC定义子过程(函数)

过程定义 过程用PROC和ENDP伪指令来声明&#xff0c; 并且必须为其分配一个名字(有效的标识符) 。目前为止&#xff0c; 我们所有编写的程序都包含了一个main过程&#xff0c; 例如&#xff1a; 当要创建的过程不是程序的启动过程时&#xff0c; 就用RET指令来结束它。RET强制…

Bean依赖注入注解开发

value Value("xfy")private String userName;private String userName;Value("xiao")public void setUserName(String userName) {this.userName userName;} Autowired // 根据类型进行注入 如果同一类型的Bean有多个&#xff0c;尝试根基名字进行二次…

AIGC,ChatGPT AI绘画 Midjourney 注册流程详细步骤

AI 绘画,Midjourney完成高清图片绘制,轻松掌握AI工具。 前期准备: ① 一个能使用的谷歌账号 ② 可以访问外网 Midjourney注册 1.进入midjourney官网https://www.midjourney.com 点击左下角”Join the Beta”,就可以注册,第一次使用的小伙伴会弹出提示,只需要点击Acc…

2019年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 怎样修改图章的颜色? A:只需要一个数字来设置颜色 B:设置RGB的值 C:在画笔中设置颜色、饱和度、亮度 D:在外观中设置或修改角色颜色特效 答案:D 在外观中设置或修改角色颜色特…

【深度学习】脸部修复,CodeFormer,论文,实战

代码&#xff1a; https://github.com/sczhou/CodeFormer 论文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工作**4 实验****4.1 数据集****4.2 实验设置和指标***…

【ArrayList是如何扩容(ArrayList、LinkedList、与Vector的区别)】

ArrayList、LinkedList、与Vector的区别 解读ArrayList 是一个可改变大小的数组LinkedList 是一个双向链表Vector 属强同步类 拓展知识面ArrayList是如何扩容&#xff1f;如何利用List实现LRU&#xff1f; 解读 List主要有ArrayList、LinkedList与Vector几种实现。这三者都实现…

[论文笔记] Scaling Laws for Neural Language Models

概览: 一、总结 计算量、数据集大小、模型参数量大小的幂律 与 训练损失呈现 线性关系。 三个参数同时放大时,如何得到最佳的性能? 更大的模型 需要 更少的样本 就能达到相同的效果。 </

开源WIFI继电器之源代码

源代码:WiFiRelay: 基于ESP8285的WiFi继电器代码

笔记本外接显示器的一些基本操作

1>&#xff0c;安装问题直接问客服&#xff0c;正常情况是将显示屏接上电源&#xff0c;然后用先将显示屏和笔记本的HDMI接口连接即可。 按下组合键 win p ,选择 “复制”。 2>&#xff0c;接上显示屏后&#xff0c;原笔记本无声音&#xff1f; 1、找到笔记本电脑右下…

Doris 建表示例(七)

建表语法 使用 CREATE TABLE 命令建立一个表(Table)。更多详细参数可以查看&#xff1a; HELP CREATE TABLE; 建表语法&#xff1a; CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name(column_definition1[, column_definition2, ...][, index_definition1[, i…