session存储在服务器中,安全性比cookie高。cookie由于存储在用户那里,所以cookie是可以被修改的。
如果使用了session,那么每一个会话在服务器中都会占一个空间存储其独有的一些信息。由于空间问题,我们不能将所以会话信息都用session处理
服务端会返回(响应)给客户端sessionID,客户端向sessionID指定的空间存储内容
浏览器利用cookie来处理sessionID,也就是我们之前看到的这个
- 作为cookie的sessionID也可以被修改,但也只能修改sessionID,而不能修改session中存储的一些敏感信息。你如果要预防用户A拿到用户B的sessionid之后在session失效前去别的机器上登录,这个是预防不了的(可以多弄几个session)。session相对与cookie安全性高在,你可以在session中存userid进数据库来保持登录状态,有的数据是不便放在cookie中的。比如密码,即使你的密码使用了哈希加密然后放在cookie中,但那也是暴露在外面了,如果B已知A的密码习惯试几个就可以试出来。
- 这里的sessionid与csfttoken是之前访问admin的时候存储过来的,在下面介绍的保存session中也会将sessionID存储到cookie。只有admin,保存session,存储cookie(key为sessionID)的路由能存储sessionID,其他路由均无法保存sessionID
- django的session数据存在数据库中,所以在使用session之前需要该项目执行过 python manage.py migrate
每一次请求会把存储的sessionid带给服务端
目录
1 配置session
2 保存(修改)session
3 获取session
4 删除session
5 不同设备的session不能相互访问
6 没有sessionID是无法获取session的
7 session过期时间
7.1 设置session有效时间
7.2 将session设置为关闭浏览器后失效
8 session的保存位置
1 配置session
使用session前需要先检查一下配置,在3.2.11版本的django中,默认是配置好了的
首先在settings.py的INSTALLED_APPS中检查django.contrib.sessions
之后在MIDDLEWARE中检查django.contrib.sessions.middleware.SessionMiddleware
2 保存(修改)session
- 修改与保存用法相同
session通过请求保存,session中是可以保存中文的,我们搞一个视图
再搞一个路由
访问一下发现可以成功访问,此时在客户端是看不到session信息的
3 获取session
由于存储在服务端,所以获取session同样使用请求
我们同样使用get方法,第一个参数是session的key,第二个参数是默认值(没有这个key时用的值)
- 也可以用中括号的方式取,中括号不能设置默认值,如果没有session中的指定key就会报错
再搞一个路由
刚刚我们已经存储过了,现在我们直接访问get_session
发现可以读到刚刚保存的内容
4 删除session
由于存储在服务端,所以删除session同样使用请求
刚刚我们已经保存过了session,get_session的状态删除前是这样的
现在我们访问delete_session删除一下
之后再访问get_session
发现使用了默认值,表明这个session已经没有了
5 不同设备的session不能相互访问
每一个浏览器都有一个独立的sessionID,我现在用我本机的谷歌浏览器保存一下session
然后再用360浏览器读取一下session
发现它是读不到的,本机的两个不同的浏览器都无法相互获取,不同的设备自然也无法相互获取
6 没有sessionID是无法获取session的
我们在有sessionid的情况下是可以获取到的
我现在手动把sessionID删了(右键sessionID然后点击delete),发现它就获取不到了
我们注意sessionID作为cookie存在是有有效期限的,所以session中的数据也是有有效期限的,当sessionID消失后便无法再次获取
再次登录admin会再次获取一个sessionID,即使使用相同的浏览器登录,sessionID也与之前的值不同了
7 session过期时间
我当前是北京时间 2022-5-23 7:35 再一次保存一个session,默认过期时间为14天
如果在14天内再次以相同浏览器登录该网站保存session,那么session会保持当前ID继续延续下去,我当前是北京时间 2022-5-23 7:42 再次保存session
发现sessionid的值不变且有效时间延后了
7.1 设置session有效时间
失效时间我们是可以手动设置的,在settings.py中加入属性SESSION_COOKIE_AGE,单位为秒
我现在让session保持一个小时
我在北京时间 2022-5-23 7:48保存的session
发现生效时间为一小时
7.2 将session设置为关闭浏览器后失效
在settings.py中加入 SESSION_EXPIRE_AT_BROWSER_CLOSE = True
这样我们再保存session时发现Max-Age那一栏就为Session,即使上面的SESSION_COOKIE_AGE设置为一个小时
关闭浏览器后再次访问主页(这里需要关闭浏览器所有页面,只要有一个页面没关,该站点的SessionID都会保留),发现Session消失了
8 session的保存位置
session的数据存储在表 django_session 中
我们之前所有的session数据都存在这里面
这里的session_key就是浏览器中的sessionid,session_data中存的是session字典的密文形式,expire_date是过期时间,过期时间为UTC时间
当epire_date到期后,django_session表中的数据并不会自动删除,比如下面到期时间为5-13日的session,我当前已经5-23日了
如果要删除过期数据,那么需要在执行python manage.py clearsessions命令
执行后再次看django_session的内容,发现过期的session已经没有了
但是我们是无法检测到用户的sessionid是否继续使用,如果用户将sessionid删了,又搞了一个,那么数据已经保留在session中,而且一个站点的session数据都保存在django_session这个表中,这个表会越来越大,导致答询session会越来越慢。
对策是不给session过长的时间,不让session存过多的数据,且每天用python manage.py clearsessions清除过期数据