zoukankan      html  css  js  c++  java
  • cookies和session

    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 的方法来保证有效期.

  • 相关阅读:
    Grid search in the tidyverse
    Handling Class Imbalance with R and Caret
    R语言-Kindle特价书爬榜示例 & 输出HTML小技巧(转)
    Centos7下安装部署MXNET
    特征选择, 经典三刀(转)
    vue知识点14
    vue知识点13
    vue知识点12
    vue知识点11
    vue知识点10
  • 原文地址:https://www.cnblogs.com/agsol/p/11985743.html
Copyright © 2011-2022 走看看