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的发展史
- 1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户在网站上的活动。
- 初始版本的Cookie只能存储很少的数据,并且没有强制加密机制,容易被恶意用户篡改或窃取。因此,随着互联网的快速发展,Cookie引起了一系列安全和隐私问题。
2.Session的发展史
- 由于Cookie存在的局限性,Web开发人员开始寻找更安全、可靠的替代方案。1997年,Sun Microsystems提出了基于服务器的会话管理方案,即Session。
- Session是在服务器端存储用户会话数据的一种技术。每当用户访问网站时,服务器会为其创建一个唯一的Session标识符(Session ID),并将会话数据存储在服务器上。
- Session ID一般通过Cookie或URL参数传递给客户端,用于识别用户的会话状态。
3.Cookie和Session的关系
- 在实际应用中,Cookie和Session通常结合使用。当用户首次访问网站时,服务器会为其分配一个唯一的Session ID,并将其存储在Cookie中,发送给客户端保存。
- 随后,客户端在每次请求中都会携带该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("拿取成功消息")
相关文章:
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.登录功能实…...
Vue批量全局处理undefined和null转为““ 空字符串
我们在处理后台返回的信息,有的时候返回的是undefined或者null,这种字符串容易引起用户的误解,所以需要我们把这些字符串处理一下。 如果每个页面都单独处理,那么页面会很冗余,并且后期如果有修改容易遗漏,…...
【2023年APMCM亚太杯C题】完整数据与解题思路
2023年亚太杯C题 数据下载与搜集重点数据其余数据第一问第二问第三问第四问第五问第六问 数据与思路获取 数据下载与搜集 该题并没有提供数据集,对所需数据进行收集整理是对题目进行求解的基础。在本题中,主要需要以下数据:新能源汽车历史销…...
嵌入式单片机方向和Linux驱动开发方向哪个发展前景好?
嵌入式单片机方向和Linux驱动开发方向哪个发展前景好? 在某些平台上看到很多人鼓吹嵌入式Linux开发比单片机开发要好,让所有人都去做嵌入式Linux开发。说这种话的人大多数是嵌入式Linux的培训机构,或者是一开始就以嵌入式Linux入门的那一批人…...
如何搭建Zblog网站并通过内网穿透将个人博客发布到公网
文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…...
2:kotlin集合(Collections)
集合有助于数据分组,方便后续操作 集合类型说明Lists有序的可重复的集合Sets无序的不可重复的集合Maps键值对映射集合,键唯一,且一个键只能映射到一个值 每个集合类型都可以是可变的或者只读的 List List按照添加的顺序存储内容ÿ…...
小诺2.0开源版工程启动
小诺是一款开源的前后端开发框架,同若依、SpringBladex一样可作为私活、外包脚手架。 开源地址:Snowy: 最新:💖国内首个国密前后分离快速开发平台💖,采用Vue3AntDesignVue3 ViteSpringBootMpHuToolSaToke…...
idea手动导入maven包
当maven仓库中没有包时,我们需要手动导入jar到maven项目中 1.这里的maven设置成你自己安装的maven 2.查看pom.xml文件中maven,以下面为例 <dependency><groupId>com.jdd.pay</groupId><artifactId>mapi-sdk-v3</artifactId&…...
2、单片机及开发板介绍
单片机介绍 单片机,英文Micro Controller Unit,简称:MCU 内部集成:CPU、RAM(随机存储器)、ROM(只读存储器)、定时器、中断系统、通讯接口等 作用:信息采集(传感器)、处理࿰…...
Leetcode 第 372 场周赛题解
Leetcode 第 372 场周赛题解 Leetcode 第 372 场周赛题解题目1:2937. 使三个字符串相等思路代码复杂度分析 题目2:2938. 区分黑球与白球思路代码复杂度分析 题目3:2939. 最大异或乘积思路代码复杂度分析 题目4:2940. 找到 Alice 和…...
mysql查询统计最近12个月的数据
项目场景: mysql查询统计最近12个月的数据,按每个月纵向展示,效果图 sql语句 注意:count( v.uuid ) 这里的是被统计那张表的id SELECT m.month,count( v.uuid ) AS total FROM (SELECT DATE_FORMAT(( CURDATE()), %Y-%m ) AS mon…...
14.Python 模块
目录 1. 使用模块2. 使用包3. 常用模块3.1 日期和时间3.2 伪随机数3.3 摘要算法3.4 JSON 处理3.5 图像处理 模块是Python用来组织代码的一种方法,包是Python用来组织模块的一种方法。 常用基本语法如下: Windows 按住winR 输入 cmd,Mac 打开…...
三十分钟学会Linux的基本操作
GNU/Linux GNU项目是由Richard Stallman发起的自由软件运动,旨在创建一个完全自由的操作系统。虽然GNU项目已经开发了大量的系统组件和工具,但它一直缺少一个完整的操作系统内核。在这时Linus Torvalds开发了Linux内核,并将其发布为自由软件…...
1688商品详情数据接口(1688.item_get)
1688商品详情数据接口是一种程序化的接口,通过这个接口,商家或开发者可以使用自己的编程技能,对1688平台上的商品信息进行查询、获取和更新。这个接口允许商家根据自身的需求,获取商品的详细信息,例如价格、库存、描述…...
SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关加餐:SpringCloud Gateway核心技术
大家好,我是冰河~~ 一不小心《SpringCloud Alibaba实战》专栏都更新到第14章了,再不上车就跟不上了,小伙伴们快跟上啊! 在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基…...
设计师不能忽视的几个宝藏图标设计工具
在这个快速变化的时代,设计师对创新和实用工具的需求越来越大。这就要求我们及时跟上潮流,不断探索和尝试最新、最有价值的图标设计工具。只有这样,我们才能在竞争激烈的设计市场中脱颖而出。以下是我们精心挑选的2024年值得一试的图标设计工…...
设计模式-行为型模式-模板方法模式
一、什么是模板模式 模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法骨架,允许子类在不改变算法整体结构的情况下重新定义算法的某些步骤。 主要组成部分: 1、模板方法(Templ…...
露营管理系统预约小程序效果如何
旅游经济已经复苏,并且市场规模增速加快,近一年来远途/周边游客户增多,不少旅游景区在节假日常常面对客流爆满现象。同时露营作为近几年突然火热的项目,其需求也是日渐上升。 然而在高需求的同时,我们也看到露营经营痛…...
【产品安全平台】上海道宁与Cybellum将整个产品安全工作流程整合到一个专用平台中,保持构建的互联产品的网络安全和网络合规性
Cybellum将 整个产品安全工作流程 整合到一个专用平台中 使设备制造商能够 保持他们构建的互联产品的 网络安全和网络合规性 产品安全性对 每个人来说都不一样 每个行业的系统、工作流程和 法规都存在根本差异 因此,Cybellum量身定制了 Cybellum的平台和技…...
css 实现鼠标上移添加下划线
效果图 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
