一, cookie
由于 HTTP 协议是无状态的, 而服务器端的业务必须是要有状态的. Cookie 诞生的最初目的是为了存储 web 中的状态信息, 以方便服务器端使用. 比如判断用户是否是第一次访问网站. 目前最新的规范是 RFC 6265, 它是一个由浏览器服务器共同协作实现的规范.
Cookie 的处理分为:
服务器像客户端发送 cookie
浏览器将 cookie 保存
之后每次 http 请求浏览器都会将 cookie 发送给服务器端
简单的来说, cookie 就是服务端给浏览器的一些键值对(key - value)
浏览器会按照规则保存下 cookie, 并在后面的请求中把这些 key-value 一并发送给服务端
服务端拿到辨别是谁给我发的请求, 是否经过认证之类
1.2 Django 中操作 cookie
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
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 区别:
cookie 保存在客户端, session 保存在服务端
cookie 的保存形式为 key-value, session 的保存形式为 key : {k1: v1, k2:v2, k3: v3}
session 的第一个 key 为服务端生成的字符串, 会以 cookie 的形式发送给客户端
默认发送 (浏览器保存) 形式为: sessionid="随机字符串"
服务器的保存形式为:"随机字符串": {k1:v1, k2: v2, k3:v3}
Django 中的 session 也是维护在 request 参数中的, COOKIES 也是
2.2 Django 操作 session
Django 在生成 session 非常的方便, 默认自动给你生成, 维护 session 的识别(随机字符串)
不需要你去手动生成维护这个字符串及对应的字典. 只需要去设置需要存储的值就行了
生成并设置 session:
- request.session['user'] = "zhangSan"
- request.session['email'] = "zhangSan123@163.com"
- request.session['pwd'] = "xxxxxxxx"
设置 session 超时时间:
request.session.set_expiry(60) #超时时间设置为 60 秒
退出时清除设置的 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 下:
存储引擎:
- # 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'
常用设置:
- 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]+:) \b/
- 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;
- }
来源: http://www.bubuko.com/infodetail-2768437.html