37.状态保持之Session详解
Posted 孤寒者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37.状态保持之Session详解相关的知识,希望对你有一定的参考价值。
引言——上文讲的是cookie,但是cookie的键和值都是明文的形式存储在客户端浏览器上,很不安全!
那有没有更好些的来存储登录状态的方式呢???
这就需要讲讲session了!
1.状态保持——cookie和session:
- http协议是无状态的:每次请求都是一次新的的请求,不会记得之前通信的状态。
- 客户端与服务端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务端存储与会话有关的数据。
- 存储方式包括cookie,session,会话一般指session对象。
- 使用cookie,所有数据存储在客户端,注意不要存储敏感信息。
- 使用session方式,所有数据存储在服务器端(以键值对形式存储),在客户端cookie中存储session_id,用户的重要信息是不会存储在客户端的,下次用户登录只需校验session_id即可,安全!!!
- 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。
注意:不同的请求者之间不会共享这个数据,与请求者一一对应。
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的特点:
-
session是以键值对进行存储的。
-
session依赖于cookie。唯一的标识码保存在sessionid cookie中。
-
session也是有过期时间。
4.讲一讲Session流程:
- 当用户登录以后,生成一个字典{key, value},将字典存入服务端session,key是自动生成的一段字符串标识,配合value是一个自定义格式的字典类型,返回cookie保存到用户浏览器端
- 在1步骤生成的字典value中自定义格式来存储用户的信息,如user信息,iflogin等。
- 当我们在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详解的主要内容,如果未能解决你的问题,请参考以下文章