一、Cookie

客户端技术,将数据信息存储到浏览器中,存储的结构是字典结构,即key-value.

Cookie是服务端创建,但保存于客户端,客户端每次发送请求时都会将Cookie信息发送到服务器(因为Cookie是请求头信息的一部分)

Cookie不支持中文,不能跨浏览器,不能跨域名

1、设置cookie

HttpResponse.set_cookie()

response.set_signed_cookie("Cookie名称","Cookie值",salt="盐")

  属性:key

     value

     max-age  有效时长,单位为秒,指定为0,表示关闭浏览器失效(默认)指定为有效数值100表示100秒后自动失效,设置为None永不过期

     expires  支持一个datetime或timedelta,可以指定一个具体的日期,expires=timedelta(days=10)表示十天后过期

     max-age和xepires两个指定一个

# 普通设置,以明文的方式显示
def setcookie(request):
response = HttpResponse('设置COOKIE成功')
response.set_cookie('name','egon')
return response
#加盐设置,以加密的形式显示
def do_login(request): uname = request.POST.get('uname') response = HttpResponseRedirect(reverse('app:mine')) # response.set_cookie('uname', uname, max_age=60)
response.set_signed_cookie('content', uname, "Rock") return response

2、获取

HttpRequest.COOKIES.get(key)

request.get_signed_cookie("cookie名称",salt="盐")

def getcookie(request):
return HttpResponse(request.COOKIES.get('name'))
def mine(request):

    # uname = request.COOKIES.get("content")

    try:

        uname = request.get_signed_cookie("content", salt="Rock")

        if uname:
# return HttpResponse(uname) return render(request, 'mine.html', context={"uname": uname})
except Exception as e:
print("获取失败") return redirect(reverse('app:login'))

3、删除

response.delete_cookie(key)

def logout(request):

    response = redirect(reverse("app:login"))

    response.delete_cookie("content")

    return response

二、Session

Session是用来表示一个用户与服务端的一次“会话”。使用客户端发送的sessionid(存在与Cookie中)与服务端的sessionid匹配,找到客户端请求所属的“会话”,经常用于登录验证。

Session一般保存在内存中,在Django中,Session默认使用数据库保存,若想变更Session的保存方式,需要添加SESSION_ENGINE配置信息,可以将session保存到redis中。

1、存储数据

HttpRequest.session[key] = value,数据进行了base64编码

2、读取数据

request.session.session_key    获取session_id

HttpRequest.session.get(key)

3、删除session

del request.session["key"]

request.session.flush()   同时清除cookie和session

request.session.clear()   清除所有session

def login(request):
if request.method == "GET":
return render(request, 'two_login.html')
elif request.method == "POST":
username = request.POST.get("username")
request.session["username"] = username
return HttpResponse("登录成功") def mine(request):
username = request.session.get("username")
print(request.session.session_key)
return render(request, 'two_mine.html', context=locals()) def logout(request):
response = redirect(reverse('myapp:mine'))
# del request.session['username']
# response.delete_cookie('sessionid')
# session cookie一起干掉
request.session.flush()
return response

4、session重要配置

①、SESSION_EXPIRE_AT_BROWSER_CLOSE = True

   当浏览器关闭时,清除本地Cookie

②、 SESSION_COOKIE_AGE = 60

   设置session保存的秒数

5、扩展:将session保存到redis

①安装django-redis-sessions库

pip install django-redis-sessions

②在settings.py中配置

SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {
'host':'127.0.0.1',
'port':6379,
'db':0,
'password':'Redis密码',
'prefix':"key前缀",
'socket_timeout':5
}

三、Token

Token是为了弥补服务端会话技术的缺点(占用服务器资源)而产生的,Token验证的思想是“以时间换空间”.

当第一次验证成功(用户名和密码正确),服务端对用户数据进行签名生成一个token,并将该token发送到客户端,当客户端发送请求时,会携带该token到服务器端,服务端对该token进行解密验证,当验证成功,则说明用户验证通过,否则验证失败.

1、基本算法

①MD5摘要算法

用来验证数据完整性 ,单向不可逆,防爆破性高,统一输出,默认输出128位的二进制,32位的16进制使用hexdigest()

import hashlib

md5 = hashlib.md5()
md5.update('xxx'.encode())
crypto_str = md5.hexdigest()

②应用

基本时间+随机数生成MD5的32位字符串

import hashlib
import random
import time

m = hashlib.md5()
m.update(str(time.time()+ random.random()).encode())
a = m.hexdigest()

2、使用方式

①使用在移动端或客户端开发中,通常以Json形式传输,需要移动端自己存储Token,需要获取Token关联数据的时候,主动传递Token

def login(request):
if request.method == "GET":
return render(request, 'two_login.html')
elif request.method == "POST":
username = request.POST.get("username")
m = hashlib.md5()
m.update(str(time.time()+ random.random()).encode())
token = m.hexdigest()
data = {
'status': 200,
'username': username,
'token': token # 设置token
}
return JsonResponse(data)

def mine(request):  # 客户端访问时候需要带上token  # http://127.0.0.1:8000/myapp/mine/?token=e912be747de3c51f11e9e9bea72b49bf
token = request.GET.get('token')
if token:
return JsonResponse({
'status': 'OK'
})

②在web开发中,Token和session类似,携带在cookie中。

def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
name = request.POST.get('name')
pwd = request.POST.get('pwd')
users = User.objects.filter(name=name,pwd=pwd)
if users:
user = users.first()
token = str(time.time())
user.token = token
user.save()
response = HttpResponse('<h3 style="color:green">登录成功</h3>')
response.set_cookie('token',token) # 将token也保存于响应对象,发送给客户端
return response else:
return HttpResponse('用户名或密码错误') def mine(request):
token = request.COOKIES.get("token")
if token:
user = User.Objects.get(token=token)
return HttpResponse('登录成功')

四、三者对比

Cookie使用更简洁,服务器压力更小,数据不是很安全

Session服务器要维护Session,相对安全

Token拥有Session的所有优点,自己维护略微麻烦,支持更多的终端

Django中的会话技术(Cookie,Session,Token)的更多相关文章

  1. Django2.2 会话技术cookie session token的区别以及实例介绍

    一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...

  2. java ->会话技术Cookie&Session

    会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...

  3. Web核心之会话技术Cookie&Session

    什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...

  4. django基础之day10,cookie session token

    https://www.cnblogs.com/Dominic-Ji/p/10886902.html cookie session token

  5. JavaWeb学习笔记五 会话技术Cookie&Session

    什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...

  6. JavaEE之会话技术Cookie&Session

    会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪         里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并 ...

  7. 会话技术Cookie&Session

    1.会话技术概述 从打开浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术用于记录本次会话中客户端的状态与数据. 会话技术分为Cookie和Session: Cookie:数据存储 ...

  8. 03012_会话技术Cookie&Session

    1.会话技术简介 (1)存储客户端的技术 网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识 ...

  9. 会话技术 Cookie+Session

    会话:这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开: 功能:在一次会话 ...

  10. Servlet 会话技术cookie和session

    会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...

随机推荐

  1. 配置tmux默认shell使用fish

    设置tmux创建新窗口的时候的默认的shell类型 编写~/.tmux.conf文件 set-option -g default-shell /usr/bin/fish # 或者你想要的任何其他 sh ...

  2. docker login harbor x509: certificate signed by unknown authority

    前言 docker login harbor x509: certificate signed by unknown authority 解决 打开 /etc/docker/daemon.json,如 ...

  3. jquery的radio的change事件

    一.用的jquery的radio的change事件:当元素的值发生改变时,会发生 change 事件,radio选择不同name值选项的时候恰巧是值发生改变 表单单选框 <input type= ...

  4. go cobra Error: required flag(s) "pkg-name" not set

    Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序.同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用. 使用 cobra init 命令 ...

  5. 往EXCEL粘贴超长整数字段

    写一个表格的HTML <table border="1"> <tr> <td>1</td> <td>1234567890 ...

  6. DevSecOps的实现与相关开源工具

    DevSecOps的实现与相关开源工具 DevSecOps是一种以自动化方式在DevOps流程中集成安全工具的方法.DevSecOps不仅仅是引入新的安全工具,还包括关于使用这些工具的必要知识.这需要 ...

  7. 技术博客:如何构建AI模拟面试系统(附完整GitHub代码)

    引言:当董明珠.雷军.马斯克和特朗普成为你的面试官 在当今竞争激烈的求职市场中,模拟面试系统正成为开发者提升竞争力的秘密武器.但传统的模拟面试太过平淡,于是我开发了一个多风格AI面试官系统,让你可以体 ...

  8. hexo搭建博客记录

    这是一次hexo搭建博客并引入archer主题的使用记录. 环境准备 首先是hexo工具的安装使用,这个工具是依赖于nodejs的一个命令行工具,并且各种使用也依赖于node生态,所以需要先进行nod ...

  9. 通过 C# 获取PDF文档中的字体名、大小、颜色、样式等

    在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响.然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文档.获取PDF中的字体信息可以解决这个问题,让我们能 ...

  10. JAVA基础之多线程三期--线程安全问题

    一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...