Cookie与Session

cookie与session简介

简介

HTTP协议中有一个特性:无状态,意思是服务端不会保存客户端的数据,客户端一直向服务端发送请求,服务端都不会认识客户端,而cookie就可以让服务端认识客户端。

cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

比如在一些网站中,你登陆后就不需要在登录了,这就是因为你的信息被保存在了cookie中,登录一次后,那些网站就知道你已经登录了。

原理

由服务器产生内容,浏览器收到后保存在cookie;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

image

session

简介

如果数据保存在cookie中,很容易被看到,安全性太低,因此需要一个新东西,那就是session。它把数据保存在了服务端,并给客户端返回一个随机字符串保存,这个随机字符串与服务端里的数据对应。每次客户端发送请求时会携带该随机字符串,服务端会进行比对。

django操作cookie

基本使用

设置cookie

def index(request):
    res = HttpResponse('index页面')
    res.set_cookie('name', 'abcd')
    return res

获取cookie

def home(request):
    if request.COOKIE.get('name'):
        return HttpResponse('cookie有name')
    return HttpResponse('cookie中没有name')

image

进阶

在上述例子中,如果我想要给多个视图函数添加一个判断cookie的功能,我们可以使用装饰器:

def login_auth(func):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):
            return func(request, *args, **kwargs)
        return HttpResponse('你的cookie中还没有name')
    return inner

set_signed_cookie(key,value,...):设置cookie

res = HttpResponse()
res.set_signed_cookie(key, value, salt='', max_age=,...)

参数说明:

  • key:cookie的键
  • value:cookie的值
  • salt:加盐处理(在cookie的值后加上一些干扰项)
  • max_age:超时时间,默认单位秒,超过时间删除cookie
  • expires:专门针对IE浏览器设置超时时间

delete_cookie(key):删除指定cookie

res = HttpResponse()
res.delete_cookie(key)

django操作session

django操作session需要用到一张表来保存session,在我们使用django数据库迁移命令会产生一堆默认的表,其中就有一张django_session表,这张表就是django用来保存session的。

设置session:

request.session['key'] = value

可以设置多个键值对,表中只用一条记录来保存。

设置session过程:

  1. 产生一个随机字符串;
  2. 表中存储随机字符串与加密数据的对应关系;
  3. 将产生的随机字符串发送给客户端并让其保存;

获取session:

request.session.get('key')

获取session过程:

  1. 自动获取客户端请求中cookie的随机字符串;
  2. 自动去存储session数据的表中比对;
  3. 如果比对成功自动获取并'解密'返回;

浏览器中保存的值:

image

服务器中保存的:
image

django默认的session失效时间是14天。

其他方法补充

session操作 作用
request.session.session_key 获取产生的随机字符串
request.session.delete() 删除所有seesion
request.session.flush() 与delete()类似
request.session.set_expiry(value) 设置失效时间
value为整数,单位为秒
value为0,浏览器关闭就失效
value为dateime或timedelta,则指定时间失效
value为None,依赖全局失效策略
request.session.keys() 获取session所有键
request.session.values() 获取session所有值
request.session.items() 获取session所有键值对
posted @ 2022-05-23 17:52  Yume_Minami  阅读(229)  评论(0编辑  收藏  举报