COOKIE和SESSION
由来
HTTP协议是无状态的,意思是客户端的每次请求都是独立的,服务端并不能识别两次请求的发出方是不是同一个客户端.状态是为了保存用户状态,因此出现了cookie和session技术.
cookie
类型为"小型文本文件",为了辨别用户身份,进行session跟踪而储存在客户端的数据.
本体是保存在浏览器上的键值对
机制
客户端发送request到服务器-->服务器发送一个httpresponse响应到客户端,其中就包含setcookie的头部-->客户端保存cookie,随后此客户端每次向服务端发送请求时,httprequest请求中就会包含cookie的头部.后端即可对此cookie进行校验.
Django操作cookie
通过实例化生成一个HttpResponse对象来设置cookie
obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj
设置cookie
obj.set_cookie("whoami","agsol")
获取cookie
通过request
request.COOKIES.get("whoami")
设置cookie的超时时间
其中,expires专为IE浏览器定制,且两者设置时间单位为秒
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)
删除cookie
在注销,退出时使用
obj.delete_cookie('key')
SESSION
在计算机中称为"会话控制".是一种用来记录用户状态的会话保持机制.session保存在服务端.
django中会自动加密,并保存在客户端的键值对
session的工作机制要依赖于cookie
session接收到用户信息之后,会随机生成一个字符串,将随机生成的字符串(session_key)与用户名绑定后存储到本地session_data中,然后将session_key作为cookie的value返回给客户端存储,下一次客户端访问时的请求头中就会带有上次服务端给的session_key,而服务端接收session_key后就可以在自己的本地校验出是否与之前用户是同一用户.
Django操作session
由于session存储在服务端,所以本地要有东西接收,可以使用默认表,在执行django的数据迁移命令时就可以生成一张用于保存session的表.
设置session
def set_session(request):
request.session['k1'] = 'agsol'
return HttpResponse('设置成功')
在执行request.session['k1'] = 'agsol'
时,发生的事情:
-
django内部通过内部算法生成一个随机字符串
-
将生成的数据保存在数据库中,格式如下
-
将产生的随机字符串也就是session_key返回给客户端,使用sessionid作为cookie的key,让浏览器保存.
获取session
request.session.get("k1")
注意:
- 后端获取session对应的值时使用之前发送给前端的键.
- django内部收到命令后会去请求头中找cookie
- 通过sessionid对应的随机字符串去django_session表中查找
- 匹配到后,通过内部算法将session_data中的数据解析,返回给程序员使用
- 没有的匹配到返回一个空字典,
设置失效时间
def set_session(request):
request.session['k1'] = 'jason666'
request.session.set_expiry(10)
return HttpResponse('设置成功')
request.session.set_expiry(value)
- 如果value是个整数,session会在些秒数后失效。
- 如果value是个datatime或timedelta,session就会在这个时间后失效。
- 如果value是0,用户关闭浏览器session就会失效。
- 如果value是None,session会依赖全局session失效策略。
- django默认的session失效时间是14天
删除session
def delete_session(request):
request.session.delete() # 客户端 服务端全部删除
# request.session.flush() # 建议使用这个
return HttpResponse("删除了")
delete同时删除cookie和本地django_session中对应数据
flush只删除cookie中的session,保留本地django_session中的数据.
注意
session创建数据,针对的时浏览器,也就是说,统一浏览器生成多个session时会保存在一条数据中
可以作为数据库的有哪些
数据库软件
关系型,
非关系型
文件
内存(缓存)
token
token是一种无状态的验证方式token由服务端产生,存储在客户端.
使用 token可以减少对对数据库的操作,加强了程序的健壮性
使用方法
将客户端发送的信息(可以是session或者mac地址),生成一个token,并将token返回客户端.下一次用户携带token访问服务端,服务端就可以通过后端判断验证是否为同一用户访问.
优点
Token完全由客户端管理,可以避开同源策略
Token可以避免csrf攻击
Token可以是无状态的,可以在多个服务间共享
有效期
可以通过refresh Token 的方法来保证有效期.