22.session

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清除过期数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值