zoukankan      html  css  js  c++  java
  • Django 中的 cookie 和 session

    一、cookie
    由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的。Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。比如判断用户是否是第一次访问网站。目前最新的规范是RFC 6265,它是一个由浏览器服务器共同协作实现的规范。

    Cookie的处理分为:

    服务器像客户端发送cookie

    浏览器将cookie保存

    之后每次http请求浏览器都会将cookie发送给服务器端

    • 简单的来说,cookie就是服务端给浏览器的一些键值对(key - value)

    浏览器会按照规则保存下 cookie,并在后面的请求中把这些 key-value一并发送给服务端
    服务端拿到辨别是谁给我发的请求,是否经过认证之类

    1.2 Django中操作cookie
    1. Django中设置cookie:

     
    from django.shortcuts import render, HttpResponse, redirect
     

    创建一个要返回给前端的对象

    response = HttpResponse("<center>404 你错了!</center>")
     

    基于response 来设置 cookie

    response.set_cookie(key="name", value="zhanSan") #这样一个带默认约束的cookie就设置好了
     

    设置一个带超时时间的cookie 参数 max_age (expire) 表示多少秒后过期

    response.set_cookie("email", "1122@163.com", max_age=60)
     

    设置一个加密(加盐)的cookie

    response.set_signed_cookie("uid", 17, salt="for_uid")
     

    大功告成,直接给客户端返回就行

    return response

    1. Django 在 request 对象中封装了所有来自客户端的数据

    所以:我们获取cookie就是基于request对象来操作
     
    request.COOKIES.get("name", None)
     

    获取那个加了盐的 key = uid 的值,需要根据加的盐反解

    request.get_signed_cookie("uid", salt="for_uid")
     

    这儿的cookies 都是以字典形式在维护的,所以不建议通过request.COOKIES["name"]去取,

    当key不存在时就报错了

    1.2 续 cookie中的其他重要参数
     
    rep = HttpResponse(...) 或 rep = render(request, ...)
     
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...)
        参数:
            key,              键
            value='',         值
            max_age=None,     超时时间
            expires=None,     超时时间(IE requires expires, so set it if hasn't been already.)
            path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
            domain=None,      Cookie生效的域名
            secure=False,     https传输
            httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    
    二、session
    • session与cookie区别:

    1. cookie保存在客户端,session保存在服务端

    2. cookie的保存形式为key-value, session的保存形式为 key : {k1: v1, k2:v2, k3: v3}

    3. session的第一个key为服务端生成的字符串,会以cookie的形式发送给客户端
      默认发送(浏览器保存)形式为:sessionid="随机字符串"
      服务器的保存形式为:"随机字符串": {k1:v1, k2: v2, k3:v3}

    4. Django 中的session也是维护在 request参数中的,COOKIES也是

    2.2 Django操作session
    • Django在生成session非常的方便,默认自动给你生成、维护 session的识别(随机字符串)

    不需要你去手动生成维护这个字符串及对应的字典。只需要去设置需要存储的值就行了

    1. 生成并设置session:
      request.session['user'] = "zhangSan"
      request.session['email'] = "zhangSan123@163.com"
      request.session['pwd'] = "xxxxxxxx"

    2. 设置session超时时间:
      request.session.set_expiry(60) #超时时间设置为60秒

    3. 退出时清除设置的session:
      request.session.clear()

    因为sesson内部是一个字典,所以字典的方法都可以使用

    所有 键、值、键值对

        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
    
    • 一些常用的session方法:

    用户session的随机字符串

    request.session.session_key
     

    将所有Session失效日期小于当前日期的数据删除

    request.session.clear_expired()
     

    检查 用户session的随机字符串 在数据库中是否

    request.session.exists("session_key")
     

    删除当前用户的所有Session数据

    request.session.delete("session_key")
     
    request.session.delete(request.session.session_key)
     
    request.session.set_expiry(value)
    * value整数,session在value秒后失效。
    * value是datatime或timedelta,session会在设定时间后失效。
    * value=0,用户关闭浏览器session就会失效。
    * value是None,session会依赖全局session失效策略。

    2.3 配置session全局设置
    • 项目木同名的settings.py下:
    1. 存储引擎:

    cache中:

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_ALIAS = "db2" #别名缓存位置,指定存储库。默认内存缓存,也可以是memcache

    数据库中

    SESSION_ENGINE = "django.contrib.sessions.backends.db"

    文件中:

    SESSION_ENGINE = "django.contrib.sessions.backends.file"
    SESSION_FILE_PATH = None #文件路径

    缓存加DB

    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

    1. 常用设置:

    SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径,'/' 为项目根目录
    SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

    三、JS操作cookie

    获取项目所有cookie

    document.cookie

    document.cookie
    "__gads=ID=3694xxxa751ed:T=1511442057:S=ALNI_MZTRxxxxNqKryxxxxZu7kjFQ; _ga=GA1.2.1165121507991355; __utma=226521935.11149926.15015647545.1531209676.1531270605.3; __utmz=2265156451270605.3.2.utmcsr=zzk.cnblogs.c587445ccn=(referral)|utmcmd=referral|sdfecct=/s/blogpost; AlwaysCresdfesAsActive=True; AdminCoosfesdfsExpandAdvanced=True; SERVERID=a15b3bd10716efwefsdfbb89e87a05|1536885192|1535456884623"
    

    可以看见全部存在一个字符串中了:那想匹配谁就用正则策略去匹配吧!
    都是 key=value; 然后以分号结尾

    var cookie_str = document.cookie
    var pattern = /你要匹配的key=([.|_a-zA-Z0-9]+:) /
    pattern.exec(cookie_str)
    
    3.2 给cookie设置超时时间
    匹配部分我使用的jquery.cookie.js插件,你也可以使用原生JavaScript
    function expire_session(name, time){
        var date_time = new Date();
        date_time.setTime(date_time.getTime()+time);
        var expires= "expires="+ date_time.toGMTString()+";path=/";
        document.cookie = name+"="+$.cookie(name)+';'+expires;
    }
    
  • 相关阅读:
    Oracle日期函数大全
    Android Permission(授权)大全
    澳大利亚项目VBA部分简略代码
    Android模拟器安装程序及上传音乐并播放
    更改电脑背景颜色,保护您的眼睛
    编写高效Excel VBA代码的最佳实践(一)
    VBA复制粘贴效率问题
    编写高效Excel VBA代码的最佳实践(二)
    编写高效Excel VBA代码的最佳实践(二)
    Android新浪星座运势程序开发
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9643904.html
Copyright © 2011-2022 走看看