Cookie与Session
cookie与session简介
cookie
简介
HTTP协议中有一个特性:无状态,意思是服务端不会保存客户端的数据,客户端一直向服务端发送请求,服务端都不会认识客户端,而cookie就可以让服务端认识客户端。
cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
比如在一些网站中,你登陆后就不需要在登录了,这就是因为你的信息被保存在了cookie中,登录一次后,那些网站就知道你已经登录了。
原理
由服务器产生内容,浏览器收到后保存在cookie;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
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')
进阶
在上述例子中,如果我想要给多个视图函数添加一个判断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过程:
- 产生一个随机字符串;
- 表中存储随机字符串与加密数据的对应关系;
- 将产生的随机字符串发送给客户端并让其保存;
获取session:
request.session.get('key')
获取session过程:
- 自动获取客户端请求中cookie的随机字符串;
- 自动去存储session数据的表中比对;
- 如果比对成功自动获取并'解密'返回;
浏览器中保存的值:
服务器中保存的:
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所有键值对 |