系统地讲解Django开发的基础知识, 高阶知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-django从入门到精通》。
10.1.1 什么是会话
在计算机术语中,会话指用户与系统进行交互的一个过程,例如用户从ATM机中取款就是一个会话过程。在ATM机取款主要包含以下几个步骤:
(1) 插卡,输入密码
(2) 输入金额,取款
(3) 退出系统,取卡
取款的过程是有"状态"的,用户在第一步操作成功后,系统便记录了用户的状态信息,这样在后续的操作过程中,无需再输入取款密码进行验证。web应用基于http协议,而http协议是一种无状态协议,每次请求结束后,服务端会断开连接, 不会保存客户端的状态。
网络通信的过程是一个请求+响应的过程。网络协议中的无状态是指,每一次请求都是独立的,不会携带状态信息。
请求独立意味着请求与请求之间不保存上下文信息。例如浏览器前后向http服务器发起两次请求,服务器处理完第1次请求,立即关闭连接,处理浏览器的第2个请求时再重新建立连接。这两次请求彼此独立,互不依赖。
如果将取款的过程转换为http请求,则用户在进行每一次操作时都必须输入取款密码,以通过系统的认证。在web应用中,为让http请求变得有“状态”,服务端会在内存中记录用户的状态信息并向客户端返回一个状态标识,客户端接下来的每一次http请求再带上这个状态标识即可。
服务端检查http请求是否携带这个状态标识,如果携带并且用户的状态信息未过期,则认为当前的用户处于"会话"中。http请求有了"状态"以后,即与服务端建立了所谓的会话。
web应用中的会话可理解为用户从登陆到退出的这样一个过程。要实现这种会话管理,需要服务端在内存中存储与用户相关的状态信息,同时客户端也需保存与用户相关的状态标识。
10.1.2 服务端session
session是基于服务端的会话管理机制,即将用户的状态信息保存在服务器中。现在以用户的登录过程和页面访问来进行举例:
(1) 用户登录web系统, 输入账号和密码
(2) 用户认证通过以后,服务端在内存中创建一个session对象,记录用户的状态信息,并向客户端(浏览器)返回一个sessionid
(3) 用户访问系统中的其它页面时,浏览器将服务端返回的sessionid携带在http请求中
(4) 服务端检查http请求中是否携带sessionid,以及sessionid对应的session是否过期
10.1.3 客户端cookie
cookie是指存储在用户机器中的一个简单文本文件,这个文本文件通常只有4KB大小。
关于cookie的定义,可以参考某百科的解释:
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
根据百科对cookie的解释,我们可以提取出以下三点关键信息:
(1) cookie是文本文件
(2) cookie文件中存储的数据用来识别用户身份
(3) cookie暂时或永久地保存于用户所在的计算机中
再以用户的登录及页面访问来举例:
(1) 用户登录web系统, 输入账号和密码
(2) 用户认证通过以后,服务端会创建一个cookie对象,cookie对象中以键值对的形式写入用户标识,创建时间,过期时间等信息。由于该cookie对象会保存在用户的机器中,所以有必要对cookie的内容进行数字签名,加密等处理,以加强其安全性。
(3) 客户端收到服务端响应的cookie以后,写入到本地的cookie文件中。
(4) 用户访问系统中的其它页面时,浏览器会将保存的cookie值携带在http请求中,服务端收到http请求以后,检查请求中是否携带cookie以及cookie是否有效。如果用户重新打开浏览器,则浏览器会从本地的cookie文件中读取cookie值。
进一步理解cookie, 需要再回到HTTP协议。在HTTP协议中定义了两个字段,分别是Cookie和Set-Cookie。
(1) Set-Cookie
Set-Cookie是在HTTP服务器对用户验证成功以后向客户端发送的一个响应字段,包含在HTTP响应的头部中。HTTP Set-Cookie响应头的格式如下所示:
Set-Cookie: <name>=<value>[; <name>=<value>]...
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure]
注:<>表示必传参数,[]表示可选参数
Set-Cookie包含若干个键值对,每个键值以英文的;进行分隔。其中expires, domain, path, secure为预定义的选项名。各选项解释如下表所示:
选项名 | 描述
|
expires | 设置cookie的有效期,如超出有效期,cookie将失效。未设置该选项时,cookie会在浏览器关闭时失效。expires的日期格式可查阅HTTP协议文档。
|
domain | 用来设置服务器所在的域名。cookie中的域名为该域名,或该域名的父级域名时,才可以发送。 |
path | 设置一个 URL 路径。该路径必须出现在客户端请求的资源的路径中,否则不会发送 Cookie。 |
secure | 用来指定,只有在请求使用SSL和HTTPS协议的时候才会发送cookie到服务器。 |
(2) Cookie
Cookie是HTTP客户端向HTTP服务器请求时所携带的请求字段,包含在HTTP头部,用来向服务器发送用户的状态信息。这里的状态信息实际是服务器在Set-Cookie字段中响应的状态信息。服务器会根据HTTP请求头中的cookie字段的信息来进行验证,验证通过以后,用户的状态才得以延续。浏览器不仅是HTTP客户端,还是一个方便的网络调试工具,在浏览器中可以分析HTTP的请求过程,以及查找HTTP请求的字段信息。下图为薯条老师使用谷歌浏览器登录知乎以后,所查找到的cookie以及UA信息:
关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。
小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。