session存储在服务器中,安全性比cookie高。cookie由于存储在用户那里,所以cookie是可以被修改的。

如果使用了session,那么每一个会话在服务器中都会占一个空间存储其独有的一些信息。由于空间问题,我们不能将所以会话信息都用session处理

服务端会返回(响应)给客户端sessionID,客户端向sessionID指定的空间存储内容

浏览器利用cookie来处理sessionID,也就是我们之前看到的这个

浏览器控制台怎么看session有效时间_服务端

  • 作为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

浏览器控制台怎么看session有效时间_django_02

之后在MIDDLEWARE中检查django.contrib.sessions.middleware.SessionMiddleware

浏览器控制台怎么看session有效时间_数据_03

2  保存(修改)session

  • 修改与保存用法相同

session通过请求保存,session中是可以保存中文的,我们搞一个视图

浏览器控制台怎么看session有效时间_数据_04

再搞一个路由

浏览器控制台怎么看session有效时间_数据_05

访问一下发现可以成功访问,此时在客户端是看不到session信息的

浏览器控制台怎么看session有效时间_服务端_06

3  获取session

由于存储在服务端,所以获取session同样使用请求

我们同样使用get方法,第一个参数是session的key,第二个参数是默认值(没有这个key时用的值)

  • 也可以用中括号的方式取,中括号不能设置默认值,如果没有session中的指定key就会报错

浏览器控制台怎么看session有效时间_服务端_07

再搞一个路由

浏览器控制台怎么看session有效时间_django_08

刚刚我们已经存储过了,现在我们直接访问get_session

浏览器控制台怎么看session有效时间_服务端_09

发现可以读到刚刚保存的内容

4  删除session

由于存储在服务端,所以删除session同样使用请求

浏览器控制台怎么看session有效时间_django_10

浏览器控制台怎么看session有效时间_数据_11

刚刚我们已经保存过了session,get_session的状态删除前是这样的

浏览器控制台怎么看session有效时间_服务端_12

现在我们访问delete_session删除一下

浏览器控制台怎么看session有效时间_django_13

之后再访问get_session

浏览器控制台怎么看session有效时间_服务端_14

发现使用了默认值,表明这个session已经没有了

5  不同设备的session不能相互访问

每一个浏览器都有一个独立的sessionID,我现在用我本机的谷歌浏览器保存一下session

浏览器控制台怎么看session有效时间_django_15

然后再用360浏览器读取一下session

浏览器控制台怎么看session有效时间_数据_16

发现它是读不到的,本机的两个不同的浏览器都无法相互获取,不同的设备自然也无法相互获取

6  没有sessionID是无法获取session的

我们在有sessionid的情况下是可以获取到的

浏览器控制台怎么看session有效时间_django_17

我现在手动把sessionID删了(右键sessionID然后点击delete),发现它就获取不到了

浏览器控制台怎么看session有效时间_django_18

我们注意sessionID作为cookie存在是有有效期限的,所以session中的数据也是有有效期限的,当sessionID消失后便无法再次获取

再次登录admin会再次获取一个sessionID,即使使用相同的浏览器登录,sessionID也与之前的值不同了

浏览器控制台怎么看session有效时间_服务端_19

7  session过期时间

我当前是北京时间 2022-5-23 7:35 再一次保存一个session,默认过期时间为14天

浏览器控制台怎么看session有效时间_django_20

如果在14天内再次以相同浏览器登录该网站保存session,那么session会保持当前ID继续延续下去,我当前是北京时间 2022-5-23 7:42 再次保存session

浏览器控制台怎么看session有效时间_django_21

发现sessionid的值不变且有效时间延后了

7.1  设置session有效时间

失效时间我们是可以手动设置的,在settings.py中加入属性SESSION_COOKIE_AGE,单位为秒

我现在让session保持一个小时

浏览器控制台怎么看session有效时间_数据_22

我在北京时间 2022-5-23 7:48保存的session

浏览器控制台怎么看session有效时间_数据_23

发现生效时间为一小时

7.2  将session设置为关闭浏览器后失效

在settings.py中加入 SESSION_EXPIRE_AT_BROWSER_CLOSE = True

浏览器控制台怎么看session有效时间_django_24

这样我们再保存session时发现Max-Age那一栏就为Session,即使上面的SESSION_COOKIE_AGE设置为一个小时

浏览器控制台怎么看session有效时间_数据_25

关闭浏览器后再次访问主页(这里需要关闭浏览器所有页面,只要有一个页面没关,该站点的SessionID都会保留),发现Session消失了

浏览器控制台怎么看session有效时间_服务端_26

8  session的保存位置

session的数据存储在表 django_session 中

浏览器控制台怎么看session有效时间_django_27

我们之前所有的session数据都存在这里面

浏览器控制台怎么看session有效时间_django_28

这里的session_key就是浏览器中的sessionid,session_data中存的是session字典的密文形式,expire_date是过期时间,过期时间为UTC时间

当epire_date到期后,django_session表中的数据并不会自动删除,比如下面到期时间为5-13日的session,我当前已经5-23日了

浏览器控制台怎么看session有效时间_django_29

如果要删除过期数据,那么需要在执行python manage.py clearsessions命令

浏览器控制台怎么看session有效时间_服务端_30

执行后再次看django_session的内容,发现过期的session已经没有了

浏览器控制台怎么看session有效时间_数据_31

但是我们是无法检测到用户的sessionid是否继续使用,如果用户将sessionid删了,又搞了一个,那么数据已经保留在session中,而且一个站点的session数据都保存在django_session这个表中,这个表会越来越大,导致答询session会越来越慢。

对策是不给session过长的时间,不让session存过多的数据,且每天用python manage.py clearsessions清除过期数据