Cookie与Session

news2024/10/2 22:27:36

文章目录

  • Cookie的介绍
    • Cookie的由来
    • 什么是Cookie
    • Cookie原理
    • Cookie覆盖
    • 浏览器查看Cookie
  • 在Django中操作Cookie
    • 设置Cookie
    • 查询浏览器携带的Cookie
    • 删除Cookie
  • Cookie校验登录
  • session

Cookie的介绍

Cookie的由来

首先我们都应该明白HTTP协议是无连接的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接英系那个后面的请求响应情况。

所以对服务端来说,每一次请求都是全新的。

状态也就是说在于服务端进行连接的过程中产生的数据,基于HTTP无连接的特性,在下一次与服务端进行连接之后又是一次全新的状态,之前的状态不会保存丝毫。

如果说我们要保存状态的话,便于下一次或更多次于服务端进行连接都拥有之前的状态,那么Cookie就诞生在这种需求下。


什么是Cookie

其实Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!


Cookie原理

Cookie的工作原理:在服务器产生后Cookie发送给浏览器,然后浏览器将其保存在本地;下次浏览器访问服务器时携带这个Cookie,那么服务端就能根据这个Cookie内容判断这个浏览器是谁了。

注意:不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你使用Chrome访问服务器时,不可能把IE保存的Cookie发送给服务器。


Cookie覆盖

服务端重复发送Cookie是会覆盖浏览器原有Cookie的,例如:浏览器第一次请求服务端返回的Cookie是:name:jack;浏览器第二次请求之后服务端又发送了Cookie给浏览器:name:tom;那么浏览器只会留下新的Cookie,也就是:name:tom;

注意:如果key不一样的话则不会覆盖,因为一个Cookie可以由好很多key-value组成

浏览器查看Cookie

window可以通过F12打开开发者选项,选择Application选项下面的Cookies
在这里插入图片描述

在已经开启的页面使用开发者选项可以看不到内容,我们再刷新一下页面就可以了。


在Django中操作Cookie

Django就是我们的服务端,浏览器向它发送请求我们可以返回一个Cookie。

设置Cookie

我们可以给基于HttpResponse类返回数据到浏览器的方法设置Cookie,如:render、redirect、JsonResponse等

	request = HttpResponse('...')
	data = render('...')

	response.set_cookie(key,value)
	data.set_cookie(key,value)

set_cookie可以设置的参数:

  • key:键
  • value:值
  • max_age=None,超时时间,cookie需要延续的时间(以秒为单位)如果参数是\None’',这个–cookie会延续到浏览器关闭为止
  • expires=None,超时时间(IE requires expires,so set it if hasn’t been already.)
  • path=‘/’,Cookie生效的路径,/表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
  • domain针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某一个子域名才有效,那么可以设置这个属性
  • secure=False,浏览器将通过HTTPS来回传cookie
  • httponly=False,只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到可以被覆盖)

set_signed_cookie:可以对Cookie的value值进行加盐

	def index(request):
	    response = HttpResponse('Hello World!')
	    response.set_cookie('name','jack')
	    response.set_signed_cookie('sex','man',salt='加盐')
	    return response

在这里插入图片描述

signed_cookie 只是加了签名的cookie,而不是被加密的cookie,在客户端还是可以看到没有加密的value的

注解作用:

单纯的记录uid或者用户名在cookie中很容易被篡改(也是不建议将用户敏感信息记录在cookie中的原因),万一攻击者把uid=1换成uid=2岂不是可以访问uid=2用户的资源了吗?而如果换成uid=2r5khk:5Qi0PuFkFQxAFkDnM-UsSljHHxM那么服务端不仅检验uid,还检验uid=2后面的签名字段,即是调用HttpRequest.get_signed_cookie(key=key,sait=sait),这样即使用户把cookie中的value换成uid=2,但是没有签名,服务端照样拒绝访问资源。


查询浏览器携带的Cookie

当我们响应给客户端Cookie保存以后,下次客户端访问我们的服务端就会携带这个Cookie来访问。

在这里插入图片描述
我们可以在视图接收到客户端的请求里面提取出Cookie的键值对,针对正常设置的Cookie和加盐的Cookie取值方式有所不同

def index(request):
    print(request.COOKIES['name'])  # 方式一:不推荐使用此方式,如果key不存在则会抛出异常:KeyError
    print(request.COOKIES.get('name'))  # 方式二:获取name键对应的value,如果key不存在则返回None
    print(request.get_signed_cookie('sex',salt='加盐')) # 获取加盐过的cookie键值,salt必须要对上不然报错
    return HttpResponse('Hello World!')

在这里插入图片描述

在这里插入图片描述

删除Cookie

删除浏览器请求里携带的某个Cookie

	def index(request):
	    response = HttpResponse('Hello World!')
	    response.delete_cookie('sex')
	    return response

在这里插入图片描述


Cookie校验登录

通过登录之后在浏览器添加Cookie,只有携带该Cookie才能访问home页面。

视图层代码

from app import models
def login(request,*arg,**kwargs):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        '''查询数据库中的用户数据比对'''
        obj = models.UserInfo.objects.filter(username=username,password=password).first()

        if obj:
            response = HttpResponse('login success!')

            response.set_cookie('name', username, max_age=30)
            response.set_cookie('msg','True',max_age=30)  # 定义过期时间

            # 它们分别都在30秒后过期,也就是浏览器只有30秒使用这个Cookie的时间,过了30秒以后再次访问将不能携带该Cookie
            return response
        else:
            return HttpResponse('账号或密码错误!')

    return render(request,'login.html')


def home(request):
    try:
        name = request.COOKIES['name']
        msg = request.COOKIES['msg']

        if name and msg == 'True':  # 判断浏览器携带的Cookie是否合格
            return render(request,'home.html')

        return redirect('/login/') # 不合格重定向到登录页面

    except: # 没有获取到指定Cookie的话,则说明Cookie过期了,重定向到登录页面
        return redirect('/login/')

在这里插入图片描述
进入home页面是在请求里头携带了服务端在浏览器登录时响应的Cookie,再次将该Cookie发送给服务端才能得到home页面的响应。
在这里插入图片描述
待我们30秒后再次刷新home页面时,就会被重定向到登录界面,因为Cookie过期了
在这里插入图片描述


如果需要有多个视图函数需要使用时,这种的每次都需要写重复的代码,这样代码的重复性就太高了,所以我们可以做一个装饰器用来存储这些重复的代码

'''检验用户登录的状态的装饰器'''
def login_auth(xxx):
    def inner(request, *args, **kwargs):
        '''
            获取到用户上一次想要访问的url
            path_info ----只有路由地址
            get_full_path ----可以访问到浏览器后携带的get参数
        '''
        if request.COOKIES.get('name'):

            return xxx(request,*args, **kwargs)
        else:
            return redirect('/login/') # 通过后缀的方式告知跳转那一个

    return inner


from app import models
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        '''查询数据库中的用户数据比对'''
        obj = models.UserInfo.objects.filter(username=username,password=password).first()

        if obj:
            response = HttpResponse('login success!')
            response.set_cookie('name', username, max_age=30)
            response.set_cookie('msg','True',max_age=30)  # 定义过期时间

            # 它们分别都在30秒后过期,也就是浏览器只有30秒使用这个Cookie的时间,过了30秒以后再次访问将不能携带该Cookie
            return response

        else:
        	return HttpResponse('账号或密码错误!')

    return render(request,'login.html')


@login_out
def func(request):
    return HttpResponse('from func')


def home(request):
    try:
        # name = request.COOKIES['name']
        # msg = request.COOKIES['msg']
        name = request.COOKIES.get('name')
        msg = request.COOKIES.get('msg')

        if name and msg == 'True':  # 判断浏览器携带的Cookie是否合格
            return render(request, 'home.html')

        return redirect('/login/')  # 不合格重定向到登录页面

    except:  # 没有获取到指定Cookie的话,则说明Cookie过期了,重定向到登录页面
        return redirect('/login/')

session

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

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

相关文章

联想拯救者Lenovo Legion R9000K 2021H(82N6)原装出厂Windows10/Win11系统ISO镜像

链接:https://pan.baidu.com/s/13NkeCXNdV0Ib5eeRnZUeAQ?pwdnlr7 提取码:nlr7 拯救者笔记本电脑原厂WIN系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文…

《数据仓库入门实践》

前言: 1、问什么要写这篇博客? 随着自己在数仓岗位工作的年限增加,对数仓的理解和认知也在发生着变化 所有用这篇博客来记录工作中用到的知识点与经验 2、这篇博客主要记录了哪些内容? 在日常工作中,发现刚接触不久数仓…

故障识别:CNN-BiLSTM-SelfAttention时空特征融合多头自注意力机制的故障识别程序,数据由Excel导入,直接运行!

适用平台:Matlab2023版及以上 本程序参考中文EI期刊《基于CNN-BiLSTM 的滚动轴承变工况故障诊断方法法》,程序注释清晰,干货满满,下面对文章和程序做简要介绍。 在CNN-BiLSTM-SelfAttention故障识别模型中,结合了卷积…

Vue中的$nextTick

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue中的$nextTick 目录 🐋Vue中的$nextTick有什么作用? 🐋一、…

易点易动设备管理系统:提升企业设备维修效率的工具

在现代企业运营中,设备的正常运行和及时维修至关重要。然而,传统的设备维修管理方法往往效率低下、易出错,给企业带来了不小的困扰。为了解决这一问题,易点易动设备管理系统应运而生。作为一款先进的智能化系统,易点易…

绝地求生:PUBG全新强化比赛验证系统即将上线,外挂的末日要来了?

就在之前官博发布了一则公告 将在未来的更新中上线强化版的比赛验证系统 具体的变更内容为:从原本的SMS验证(短信验证)变成了ARS验证(语音验证码验证)。看起来好像跟原本的验证方式没有太大区别。不过很多黑号他们是没…

3分钟使用 WebSocket 搭建属于自己的聊天室(WebSocket 原理、应用解析)

文章目录 WebSocket 的由来WebSocket 是什么WebSocket 优缺点优点缺点 WebSocket 适用场景主流浏览器对 WebSocket 的兼容性WebSocket 通信过程以及原理建立连接具体过程示例Sec-WebSocket-KeySec-WebSocket-Extensions 数据通信数据帧帧头(Frame Header&#xff09…

Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案自己写的HLS图像缩放方案 3、设计思路详解Video Processing Subsystem 介绍 4、工程代码详解PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项…

MEMS制造的基本工艺——晶圆键合工艺

晶圆键合是一种晶圆级封装技术,用于制造微机电系统 (MEMS)、纳米机电系统 (NEMS)、微电子学和光电子学,确保机械稳定和气密密封。用于 MEMS/NEMS 的晶圆直径范围为 100 毫米至 200 毫米(4 英寸至 8 英寸),用于生产微电…

wpf使用CefSharp.OffScreen模拟网页登录,并获取身份cookie,C#后台执行js

目录 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取逻辑模拟登录拦截请求Cookie获取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

NX二次开发UF_CAM_set_clear_plane_status 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_clear_plane_status Defined in: uf_cam_planes.h int UF_CAM_set_clear_plane_status(tag_t object_tag, UF_PARAM_clrplane_status_t status ) overview 概述 Set th…

安防视频EasyCVR平台太阳能供电+4G摄像头视频监控方案的建设

在工地、光伏、风电站、水库河道等场景中&#xff0c;以及一些偏远地区的项目现场&#xff0c;会存在无网无电情况&#xff0c;大大制约了视频监控系统建设的效率及可行性。在这种场景中&#xff0c;我们也可以通过太阳能供电4G监控摄像机的方案&#xff0c;满足偏远地区无网无…

【Vue】Node.js的下载安装与配置

目录 一.下载安装 官网&#xff1a; 二.环境变量的配置 三.设置全局路径和缓存路径 四.配置淘宝镜像 五.查看配置 六.使用npm安装cnpm ​ 一.下载安装 官网&#xff1a; https://nodejs.org/en/download 下载完之后&#xff0c;安装的时候一直点next即可&#xff0c…

Nginx配置文件中的关键字是什么?详细解释来了

点击上方蓝字关注我 Nginx 是一款高性能的 Web 服务器软件&#xff0c;同时也是一款反向代理服务器软件。Nginx 的配置文件通常是 /etc/nginx/nginx.conf&#xff0c;以下是一个典型的配置文件&#xff0c;并对其中的关键字进行详细解释。 1. 配置文件 perlCopy codeuser ngin…

python爬虫教程:selenium常用API用法和浏览器控制

文章目录 selenium apiwebdriver常用APIwebelement常用API 控制浏览器 selenium api selenium新版本(4.8.2)很多函数&#xff0c;包括元素定位、很多API方法均发生变化&#xff0c;本文记录以selenium4.8.2为准。 webdriver常用API 方法描述get(String url)访问目标url地址&…

智能车入门——舵机

在进行智能车竞赛时&#xff0c;舵机的学习过程至关重要&#xff0c;以下是在这一过程中需要注意的几个关键步骤。 舵机概念与结构 舵机主要由直流电机、变速齿轮组、电位器、控制板所构成&#xff0c;舵机的输出轴与电位器是同轴的&#xff0c;当舵机收到控制信号之后会驱动电…

Uptime Kuma 企业微信群机器人告警

curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa \-H Content-Type: application/json \-d {"msgtype": "text","text": {"content": "hello world"}}企业微信群机器人ke…

装饰器设计模式是什么?什么是 Decorator 装饰器设计模式?Python 装饰器设计模式示例代码

什么是 Decorator 装饰器设计模式&#xff1f; 装饰器模式是一种结构型设计模式&#xff0c;它允许向现有对象动态地添加新功能&#xff0c;同时不改变其结构。这种模式实现了对对象的包装&#xff0c;称为装饰器&#xff0c;并且可以在运行时动态地添加、修改或删除对象的行为…

PyTorch深度学习实战——人体姿态估计

PyTorch深度学习实战——人体姿态估计 0. 前言1. 人体姿态估计2. 使用 Detectron2 实现人体姿态估计相关链接 0. 前言 我们已经学习了如何执行实例分割&#xff0c;在本节中&#xff0c;我们将了解如何利用 Detectron2 对图像执行人体姿态估计&#xff0c;检测图像中人物的身体…

2023亚太杯数学建模A题思路 - 采果机器人的图像识别技术

# 1 赛题 问题A 采果机器人的图像识别技术 中国是世界上最大的苹果生产国&#xff0c;年产量约为3500万吨。与此同时&#xff0c;中国也是世 界上最大的苹果出口国&#xff0c;全球每两个苹果中就有一个&#xff0c;全球超过六分之一的苹果出口 自中国。中国提出了一带一路倡议…