Cookie与Session

文章目录

  • 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不存在则会抛出异常:KeyErrorprint(request.COOKIES.get('name'))  # 方式二:获取name键对应的value,如果key不存在则返回Noneprint(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秒以后再次访问将不能携带该Cookiereturn responseelse: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):'''获取到用户上一次想要访问的urlpath_info ----只有路由地址get_full_path ----可以访问到浏览器后携带的get参数'''if request.COOKIES.get('name'):return xxx(request,*args, **kwargs)else:return redirect('/login/') # 通过后缀的方式告知跳转那一个return innerfrom 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秒以后再次访问将不能携带该Cookiereturn responseelse: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.mzph.cn/news/161221.shtml

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

相关文章

CSS特效016:天窗扬起合上的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

【c++Leetcode】206. Reverse Linked List

问题入口 time complexity: O(n), space complexity:O(1) ListNode* reverseList(ListNode* head) {ListNode* prev nullptr;ListNode* curr head;while(curr){ListNode* forward curr->next;curr->next prev;prev curr;curr forward;}return prev; } time comp…

虹科Pico汽车示波器 | 汽车免拆检修 | 2017款东风本田XR-V车转向助力左右不一致

一、故障现象 一辆2017款东风本田XR-V车,搭载R18ZA发动机,累计行驶里程约为4万km。车主反映,车辆行驶或静止时,向右侧转向比向左侧转向沉重。 二、故障诊断 接车后试车,起动发动机,组合仪表上无故障灯点亮&…

数据仓库岗面试

1.自我介绍 2.求用户连续登录3天,要讲出多种解法 解法1(使用SQL): SELECTuserid FROMloginrecord WHEREDATEDIFF(day, time, LAG(time) OVER (PARTITION BY userid ORDER BY time)) 1AND DATEDIFF(day, LAG(time) OVER (PARTI…

SQL知多少?这篇文章让你从小白到入门

个人网站 本文首发公众号小肖学数据分析 SQL(Structured Query Language)是一种用于管理和处理关系型数据库的编程语言。 对于想要成为数据分析师、数据库管理员或者Web开发人员的小白来说,学习SQL是一个很好的起点。 本文将为你提供一个…

ElasticSearch之系统关键配置

集群名称 在配置文件$ES_HOME/config/elasticsearch.yml中指定,样例如下: cluster:name: logging-prod或者 cluster.name: logging-prod节点的名称 在配置文件$ES_HOME/config/elasticsearch.yml中指定,样例如下: node:name:…

frp内网穿透配置以及相关端口、过程解释

介绍 假设现有外网笔记本、云服务器、内网工作站三台设备,希望使用外网笔记本通过云服务器转发,访问内网工作站;这里使用frp进行内网穿透。 云服务器端配置 登录腾讯轻量型云服务器控制台,开放转发端口、bind_port以及deshboad…

opencv-图像轮廓

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 • 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检…

uni-app小程序 swiper 分页器样式修改

小程序中使用 wx-swiper-dot和wx-swiper-dot-active选择器 H5中使用uni-swiper-dot和uni-swiper-dot-active选择器 .swiper {height: 408px;margin-bottom: 28rpx;::v-deep .uni-swiper-dot {background: #e7e7e7;&.uni-swiper-dot-active {background: #b1b1b1;}}// #ifde…

php文件上传例子

目录结构&#xff1a; index.html代码&#xff1a; <!DOCTYPE html> <html><head><title>文件上传</title><meta charset"utf-8"></head><body><form action"./up.php" method"post" encty…

PHP基础与安全

基础 1. 简介概述 ●PHP是脚本语言-是一门弱类型语言&#xff0c;不需要事先编译 ●PHP 脚本在服务器上执行&#xff0c;然后向浏览器发送回纯文本的 HTML 结果 ●超文本预处理器&#xff0c;服务器端脚本语 2.创建&#xff08;声明&#xff09;PHP变量 ● 变量以 $ 符号开…

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

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

【bug 回顾】上传图片超时

测试 bug 问题分析 - 上传图片超时 最近在测试上遇到一个莫名奇妙的问题&#xff0c;最后也没有得到具体是哪块的原因&#xff0c;看各位大佬有没有思路&#xff1f;&#xff1f; 一 、背景 现在我们有三台服务器&#xff0c;用来布两套环境。其中另外一台服务器3配置的 tom…

JVM中判断对象是否需要回收的方法

在堆里面存放着Java 世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“ 存活 ” 着&#xff0c;哪些已经 “ 死去 ”。 引用计数算法 引用计数法是一种内存管理技术&#xff0c;它是通过对每个对象进行引用…

likeshop单商户商城系统 任意文件上传漏洞复现

0x01 产品简介 likeshop单商户标准商城系统适用于B2C、单商户、自营商城场景。完美契合私域流量变现闭环交易使用。 系统拥有丰富的营销玩法&#xff0c;强大的分销能力&#xff0c;支持电子面单和小程序直播等功能。无论运营还是二开都是性价比极高的100%开源商城系统。 0x02…

java--飞翔的小鸟

游戏玩法&#xff1a;通过鼠标点击使小鸟上下移动穿过柱子并完成得分&#xff0c;小鸟碰到柱子或掉落到地面上都会结束游戏。 游戏内图片 Brid类&#xff1a; package bird;import org.omg.CORBA.IMP_LIMIT;import javax.imageio.ImageIO; import java.awt.image.BufferedIma…

前置声明避免循环依赖

当你有两个类互相引用的情况时&#xff0c;使用前置声明可以帮助你避免循环依赖。以下是一个简单的例子&#xff0c;其中包含两个头文件、两个源文件以及一个 main 函数的示例 Toolnterface.h #pragma once#include <QString>// Forward declaration of QToolBase clas…

Eclipse常用设置-乱码

在用Eclipse进行Java代码开发时&#xff0c;经常会遇到一些问题&#xff0c;记录下来&#xff0c;方便查看。 一、properties文件乱码 常用的配置文件properties里中文的乱码&#xff0c;不利于识别。 处理流程&#xff1a;Window -> Preferences -> General -> Ja…

golang学习笔记——罗马数字转换器

文章目录 罗马数字转换器代码 参考LeetCode 罗马数字转整数代码 罗马数字转换器 编写一个程序来转换罗马数字&#xff08;例如将 MCLX 转换成 1,160&#xff09;。 使用映射加载要用于将字符串字符转换为数字的基本罗马数字。 例如&#xff0c;M 将是映射中的键&#xff0c;其值…

Qt+sqlite3使用事务提升插入效率

参考&#xff1a; 【精选】SQLite批量插入效率_sqlite 批量插入_PengX_Seek的博客-CSDN博客 (1)不使用事务时&#xff1a; clock_t t_start clock();QSqlQuery query(db);QString sql("insert into test(col1,col2) values(1,2);");for (int i 0; i < 1000; i…