1>介绍
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,
存在安全隐患,于是cookie+session出现了!我们可以把关于用户的数据保存在服务端,
在客户端cookie里加一个sessionID(随机字符串),服务端通过校验这个sessionID来处理后续操作,
用户的隐秘信息便不会在请求的时候传来传去,是否安全多了呢。
Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享
的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各
自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从
用户各自的session中 取出数据为用户服务。
cookie+session的工作流程:
(1)、当用户来访问服务端时,服务端生成一个随机字符串;
(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存到数据库,django_session表;
2>用法
先看下一些基本的语法
1
、设置Sessions值 request.session['session_name'
]
=
"admin"
2
、获取Sessions值 session_name =
request.session[
"session_name"
]
3
、删除Sessions值 del
request.session[
"session_name"
](不建议使用,会留下cookie)
4
、flush() 删除当前的会话数据并删除会话的Cookie。(建议使用,彻底删除,cookie也删,不留任何痕迹)
基于之前session登陆验证的例子,用session改写一下,如下
session取值
对应server端针对请求生成cookie的三步:1、生成随机字符串;2、sessionid和随机字符串组成键值,放入cookie返回给
客户端;3、django_session表中同步记录 随机字符串和用户信息的键值对,存储在表中。
响应用户取值也有三步:1、先从cookie中通过sessionid获取 随机字符串;2、在django_session表中过滤出session_key
等于随机字符串的一条记录;3、从这条记录的session_data中取出对应的数据,服务客户端。
再看下两种删除session的方式
3>session相关的配置
SESSION_ENGINE
=
'django.contrib.sessions.backends.db'
# 引擎(默认)
SESSION_COOKIE_NAME =
"sessionid"
# Session的cookie保存在浏览器上时的key的名称
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,默认修改之后才保存(默认)
解释下 SESSION_SAVE_EVERY_REQUEST,比如设置session过期时间为10s,当默认值为False的时候,固定10秒后
session失效,当这个值为True,只要你在10秒内有访问请求,失效时间就会再往后延10秒,就是这个10是从最新
的一次请求开始计算,若每个10秒内一直有请求,则session会一直保存,不会失效。
4>总结----cookie和session
借张图来说明下
4.1>客户端首次发送请求,登陆成功后,服务端会先生成一个session id,也就是一个随机字符串;
4.2>服务端把sessionid和随机字符串组成键值对,放入cookie传送给客户端;
4.3>服务端这边同步以 随机字符串 和用户信息数据组成键值对,存入数据库,也就是django-session表中;
4.4>客户端再次发送请求,cookie里面会带之前服务端相应的session键值对;
4.5>服务端根据sessionid的值,也就是随机字符串去数据库中,查找对应的记录;
4.6>根据找到的记录,取出session_data里面的值,供客户使用。