写在前面
cookie、session之前就学过,但是时间有点长忘了,刚好做项目又需要用到,写这篇文章来记录一下。
参考博文
cookie 和 session 概念
- cookie产生背景
cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。
- cookie 工作原理
cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。
- 问题的产生
问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。
- session产生背景
我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
session的工作流程
1、当用户来访问服务端时,服务端会生成一个随机字符串;
2、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对加到cookie里发送给用户;
3、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;
4、再访问服务时客户端会带上sessionid,服务器根据sessionid来确认用户是否访问过网站
总结
cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。
注意: 上述所说的cookie和session其实是共通性的东西,不限于语言和框架。
cookie和session的区别与联系
- 区别
-
session将数据存储与服务器端 cookie存储在客户端
cookie 存储在客户端,不安全,session存储在服务器端,客户端只存sesseionid,安全 -
cookie在客户端存储值有大小的限制,大约几kb。session没有限制
-
联系
- session基于cookie
Django设置与获取cookie
- 设置cookie
rep = HttpResponse(...)
# rep = render(request, ...)
# rep = redirect(...)
# 设置cookie
rep.set_cookie(key,value,...) #设置cookie
rep.set_signed_cookie(key,value,salt='加密盐',...)#设置加密cookie
# 返回带cookie的页面
return rep
- 设置cookie参数解析
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
参数 | 含义 |
---|---|
key | 键 |
value='' | 值 |
salt='' | 加密盐,也就是加密的方式,可以自定义设置 |
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获取(不是绝对,底层抓包可以获取到也可以被覆盖) |
- 获取cookie
request.COOKIES['key'] # 获取cookie
request.COOKIES.get('key') # 获取cookie
request.get_signed_cookie(key, default=RAISE_ERROR, salt='加密盐', max_age=None) # 获取加密的cookie,设置的加密盐应该和解密的加密盐一致
Django设置与获取session
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
-
数据库(默认)
-
缓存
-
文件
-
缓存+数据库
-
加密cookie
1、数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
- a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.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,默认修改之后才保存(默认)
- b. 使用
def index(request):
# 获取、设置、删除Session中数据
request.session['k1'] = 123
# 设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session.setdefault('k1',123) # 存在则不设置
# 删除Session中数据
del request.session['k1']
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
- c. 其他用法
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
request.session.set_expiry(value)
# 1、 如果value是个整数,session会在些秒数后失效。
# 2、如果value是个datatime或timedelta,session就会在这个时间后失效。
# 3、 如果value是0,用户关闭浏览器session就会失效。
# 4、 如果value是None,session会依赖全局session失效策略。
2、缓存Session
- a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,必须的
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
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,默认修改之后才保存
- b. 使用
同上
3、文件Session
- a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径
# * 如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir();如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
# * 例如:SESSION_FILE_PATH = os.path.join(BASE_DIR,'cache') # 会创建一个cache目录,用于存放session
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,默认修改之后才保存
- b. 使用
同上
4、缓存+数据库Session
数据库用于做持久化,缓存用于提高效率
- a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
- b. 使用
同上
5、加密cookie Session
- a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
- b. 使用
同上
网友评论