37.状态保持之Session详解

Posted 孤寒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37.状态保持之Session详解相关的知识,希望对你有一定的参考价值。

引言——上文讲的是cookie,但是cookie的键和值都是明文的形式存储在客户端浏览器上,很不安全!
那有没有更好些的来存储登录状态的方式呢???
这就需要讲讲session了!

1.状态保持——cookie和session:

  1. http协议是无状态的:每次请求都是一次新的的请求,不会记得之前通信的状态。
  2. 客户端与服务端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务端存储与会话有关的数据。
  3. 存储方式包括cookie,session,会话一般指session对象。
  4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息。
  5. 使用session方式,所有数据存储在服务器端(以键值对形式存储),在客户端cookie中存储session_id,用户的重要信息是不会存储在客户端的,下次用户登录只需校验session_id即可,安全!!!
  6. 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。
    注意:不同的请求者之间不会共享这个数据,与请求者一一对应。
session依赖于cookie!!!

2.来讲讲session的由来:

  • Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

  • 问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

  • 我们可以给每个客户端的Cookie分配一个唯一的id(sessionid),这样用户在访问时,通过Cookie(获取其内的sessionid值),服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的sessionid,在服务器上保存一段时间的私密资料,如“账号密码”等等。

  • 总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

  • 另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

3.Session的特点:

  1. session是以键值对进行存储的。

  2. session依赖于cookie。唯一的标识码保存在sessionid cookie中。

  3. session也是有过期时间。

4.讲一讲Session流程:

  1. 当用户登录以后,生成一个字典{key, value},将字典存入服务端session,key是自动生成的一段字符串标识,配合value是一个自定义格式的字典类型,返回cookie保存到用户浏览器端
  2. 在1步骤生成的字典value中自定义格式来存储用户的信息,如user信息,iflogin等。
  3. 当我们在django中用到session时,cookie由服务器端随机生成,写到浏览器的cookie中。每个浏览器都有自己的cookie值,是session寻找用户信息的唯一标识。每个浏览器请求到后台接收的request.session等价于在1中session字典的key(cookie)对应的value。这样我们就能识别出用户,并判断其状态!

5.实战使用——分三步走来操作一波:

(注: 使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表)

第一步:使用之前确保项目目录下的settings.py文件中已经配置好下面两个地方!

第二步:通过观察可知,在我们的数据库中已经映射了对应的表!

查看表结构发现:其中有三个字段,分别是:

  • session_key(就是上面所说的session_id);
  • session_data(就是对应的用户的隐私数据);
  • expire_date(就是session的过期时间)

第三步:session的简单操作(设置;服务端获取;删除)

启用会话后,每个HttpRequest对象将具有一个session属性,它是一个既可读又可写的类似于字典的对象,表示当前的会话。

  • get(key, default=None):根据键获取会话的值
  • flush():删除当前的会话数据并删除会话的Cookie
from django.views import View			#使用类视图,要导入!
from django.http import HttpResponse

class Test08(View):
    def get(self,request):
        #对session的设置
        request.session["name"] = "xiaoming"
        request.session.set_expiry(100)       #设置过期时间,单位为秒。到时间则自动删除。 (比如你网页登录12306,多久时间内再次登录可不用重新登录!)

        # 对session的访问,只能在服务端获取!
        name = request.session.get("name","未登录")        #第二个参数为默认值。如果获取的键不存在则显示默认值。
        print(name)

        # 对session的删除                      #(比如网页中登录12306之后,你退出!)
        request.session.flush()

        return HttpResponse("完成!")

注意:
观察可知:客户端中存储的cookie中有sessionid键值对(但是没有值,即不会存储用户的隐私数据),而sessionid的值刚好与服务端中session表中的session_key值相同!(用户的隐私数据是仅仅存储在服务端中的,安全哦!)

拓展——会话过期时间细谈:

第一种设置的方法:

  • set_expiry(value):设置会话的超时时间
  • 如果没有指定,则两个星期后过期
  • 如果value是一个整数,会话将在values秒没有活动后过期
  • 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
  • 如果value为None,那么会话永不过期

第二种设置的方法:
(settings.py文件中的配置;可以不配置,那么都是默认的选项)

❤️可以扫码关注本人公众号——任何问题都可在公众号提问(定时有专人解答);并且不定时更新干货文。欢迎关注哦!❤️

以上是关于37.状态保持之Session详解的主要内容,如果未能解决你的问题,请参考以下文章

cookie和session的区别详解

django基础知识之状态保持session:

Java Web 会话机制,Cookie和Session详解

Python接口自动化之Token详解及应用

Python接口自动化之Token详解及应用

JavaWeb Session详解