码迷,mamicode.com
首页 > 其他好文 > 详细

cookies和session

时间:2019-12-04 22:19:16      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:class   delete   键值对   one   关闭浏览器   没有   意思   flush   由来   

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‘时,发生的事情:

  1. django内部通过内部算法生成一个随机字符串

  2. 将生成的数据保存在数据库中,格式如下

    技术图片

  3. 将产生的随机字符串也就是session_key返回给客户端,使用sessionid作为cookie的key,让浏览器保存.

获取session
request.session.get("k1")

注意:

  1. 后端获取session对应的值时使用之前发送给前端的键.
  2. django内部收到命令后会去请求头中找cookie
  3. 通过sessionid对应的随机字符串去django_session表中查找
  4. 匹配到后,通过内部算法将session_data中的数据解析,返回给程序员使用
  5. 没有的匹配到返回一个空字典,
设置失效时间
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 的方法来保证有效期.

cookies和session

标签:class   delete   键值对   one   关闭浏览器   没有   意思   flush   由来   

原文地址:https://www.cnblogs.com/agsol/p/11985743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!