day56 cookie和session和中间件

2023-12-12 16:18
文章标签 session cookie 中间件 day56

本文主要是介绍day56 cookie和session和中间件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

day56 cookie和session和中间件

Cookie和session

Cookie初识

Cookie的由来

大家都知道HTTP协议是无状态的。

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

一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。

状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

并且还有一个问题就是,你登陆我的网站的时候,我没法确定你是不是登陆了,之前我们学的django,虽然写了很多页面,但是用户不用登陆都是可以看所有网页的,只要他知道网址就行,但是我们为了自己的安全机制,我们是不是要做验证啊,访问哪一个网址,都要验证用户的身份,但是还有保证什么呢,用户登陆过之后,还要保证登陆了的用户不需要再重复登陆,就能够访问我网站的其他的网址的页面,对不对,但是http无状态啊,怎么保证这个事情呢?此时就要找cookie了。

什么是Cookie

首先来讲,cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,可以理解为服务端给客户端的一个小甜点,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

Cookie的原理

Cookie的工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

Http协议特点
  • 无状态,无连接(HTTP 1.1 版本出现了短连接)
  • 格式:请求行 – 请求头 – 空行 – 请求数据

django 操作cookie

获取cookie:

request.COOKIES.get('xx')

获取签名cookie(不常用):

request.get_signed_cookie('is_login',salt='xxxxxx')

设置cookie:

HttpResponse('xx').set_cookie('键','值')

设置签名cookie(不常用):

ret.set_signed_cookie('is_login',True,'xxxxxx')

设置cookie超时时间和过期日期:

ret.set_cookie('is_login',True,max_age=5) # 超时时间 秒数
ret.set_cookie('is_login',True,expires=datetime.datetime.now() + datetime.timedelta(days=7))  #过期日期

删除cookie:

ret.delete_cookie('xxoo')

session的优势

  1. 借助于cookie进行传输
  2. 非明文显示
  3. 长度不限
  4. Django为我们提供了十分方便的session使用接口,只需要简单地几条命令就可以实现session的设置、获取和清空。

设置session

request.session['xx'] = 'oo'

设置session的命令包括三个步骤:

  1. 生成随机字符串
  2. 放到cookie中进行传输
  3. 将随机字符串和对应数据保存到自己服务端的数据库中,django-session表

获取session

request.session.get('xx') -- 'oo'

这简简单单的一条命令,其实隐含了大约三个获取session的步骤,也就是设置session的逆过程:

# 1 取出cookie中的session随机字符串{'sessionid':'asdfasfpoaijsdgihsdj'}
xx = request.COOKIES.get('sessionid')
# 2 到数据库中查询这个sessionid对应的那条记录
data = select session_data from django_session where session_key = xx;
# 3 拿出记录中的session_data数据部分进行解密,并取出数据
dic = sss(data) -- {'is_login':True}
dic.get('is_login') -- True

注销session

@func
def logout(request):request.session.flush()  # 删除sessionreturn redirect('login')

session.flush()命令是将session注销,主要是两个步骤:

  1. 删除cookie中的sessionid那个键值对
  2. 删除了数据库中的这条记录

Cookie 和 session 的总结与对比

cookie:

  • 保持会话,使用户不需要重复地去登录
  • 有大小限制
  • 有个数限制
  • Cookie总大小上限为4KB
  • 一个服务器最多在客户端浏览器上保存20个Cookie
  • 一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器

session:

  • 比cookie面上安全一些
  • session没有大小限制
  • 可以配置多个存储方案,可以配置到缓存中

中间件

自定义中间件

# 第一步,在应用下面创建一个文件夹,名字随便,比如mymiddleware,在这个文件夹下创建 一个py文件,名字随便,比如叫做xx.py# 第二步:在xx.py文件中定义类,写法如下from django.shortcuts import redirect,HttpResponse,renderfrom django.utils.deprecation import MiddlewareMixin  #引入django这个类class Auth(MiddlewareMixin):  #继承这个类# 白名单  认证白名单white_list = ['/login/',]def process_request(self,request):  #想对请求进行统一的处理,那么就定义一个process_request方法# 如果方法返回值是None,那就通过了这个方法的认证或者处理,如果返回的值HttpResponse对象,那么请求到这里就结束了,直接返回给了浏览器if request.path in self.white_list:passelse:is_login = request.session.get('is_login')if is_login == True:passelse:return HttpResponse('滚犊子!!')# 第三步,settings配置文件中写上这个类的路径MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','app01.mymiddleware.xx.Auth',
]

process_response方法

def process_response(self,request,response):''':param request::param response:  就是视图的返回值(HttpResponse对象):return:'''# print(response)return response

process_view以及执行顺序

from django.shortcuts import redirect,HttpResponse,render# 引入django的模块
from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self,request):print('MD1--process_request')return HttpResponse('xxxlpapsjdfoajsdfh')def process_response(self, request,response):print('MD1--process_response')return responsedef process_view(self, request, view_func, view_args, view_kwargs):print('MD1---',view_func.__name__)# view_func就是url对应那个views里面的视图函数,视图函数的参数view_args, view_kwargsclass MD2(MiddlewareMixin):def process_request(self, request):print('MD2--process_request')def process_response(self, request, response):print('MD2--process_response')return responsedef process_view(self, request, view_func, view_args, view_kwargs):print('MD2---',view_func.__name__)

这篇关于day56 cookie和session和中间件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485203

相关文章

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

JavaScript中document.cookie

“某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为 Cookie。”—— MSIE 帮助。一般来说,Cookies 是 CGI 或类似,比 HTML 高级的文件、程序等创建的,但是 javascript 也提供了对 Cookies 的很全面的访问权利。       每个 Cookie 都是这样的:<cookie名>=<值>   <cookie名>的限制与 javasc

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

基于shard-jdbc中间件,实现数据分库分表

一、水平分割 1、水平分库 1)、概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中。 2)、结果 每个库的结构都一样;数据都不一样; 所有库的并集是全量数据; 2、水平分表 1)、概念 以字段为依据,按照一定策略,将一个表中的数据拆分到多个表中。 2)、结果 每个表的结构都一样;数据都不一样; 所有表的并集是全量数据; 二、Shard-jdbc 中间件 1、架构图 2、特点

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

Session用法详解

本文引用http://www.accdb.net/article.asp?id=1115 阅读本文章之前的准备   阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。   懂得ASP/ASP.NET编程    了解ASP/ASP.NET的Session模型    了解ASP.NET Web应用程序模型    了解ASP.N

zdppy+vue3+onlyoffice文档管理系统实战 20240906 上课笔记 整合权限校验中间件

基于角色方法的中间件基本用法 import zdppy_api as apiimport zdppy_apimidauthasync def index(request):return api.resp.success()async def login(request):token = zdppy_apimidauth.get_role_token(role="admin")return ap

【Http 每日一问,访问服务端的鉴权Token放在header还是cookie更合适?】

结论先行: token静态的,不变的,放在header里面。 典型场景 ,每次访问时需要带个静态token请求服务端,向服务端表明是谁请求,此时token也可以认为是个固定的access-key。token动态的,会失效,放在cookie里面。 典型场景,业务登录态token,存在有效期的,过一段时间可能会失效。 下面具体展开下。 在选择将鉴权 Token 放在 HTTP Header 还是

剖析Cookie的工作原理及其安全风险

Cookie的工作原理主要涉及到HTTP协议中的状态管理。HTTP协议本身是无状态的,这意味着每次请求都是独立的,服务器不会保留之前的请求信息。为了在无状态的HTTP协议上实现有状态的会话,引入了Cookie机制。 1. Cookie定义 Cookie,也称为HTTP cookie、web cookie、互联网cookie或浏览器cookie,是一种用于在用户浏览网站时识别用户并为其准备

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX_SESSION