passerbytiny
2018-08-20 18:08:01 +08:00
理论依据:HTTP 单次访问是无状态的,但 HTTP 连续访问是有会话状态的;会话状态由服务器保存;只要能够保证获取验证码、使用验证码这两个请求处于同一个会话,那么验证码就是可以验证的。
HTTP 会话状态是 OSI 第七层应用层独立管理的事,跟第四层传输层 TCP 连接没有任何关系。
HTTP 会话跟踪原理:首次连接服务器生成唯一标识,并且通知客户端;后续连接,客户端都带上该标识;服务器根据唯一标识,判断是否属于同一个会话。唯一标识由服务器生成和校验,客户端只能够暂存和传递,所以该会话是完全由服务器控制的。
HTTP 会话 Cookie 实现方式:服务器通过 set-cookie 将唯一标识通知给客户端,一般都会制定 cookie 的有效期是内存级别,级浏览器关了 cookie 就没了。
HTTP 会话 URL 重写实现方式:服务器通过 URL 重定向将唯一标识通知给客户端,唯一标识就在新的 URL 地址上,客户端不保存唯一标识,但后续的所有请求的 URL 地址中,都回带上唯一标识。此方式很容易失效。
以上两种,只是传统的实现方式,并不是唯一的。你完全可以抛开浏览器和服务器框架,自己实现会话跟踪。例如:如果服务器愿意,浏览器可以通过 H5 的 web 存储暂存唯一标识;服务器也可以抛开语言框架,自己写业务代码,用 redis 或者独立服务管理唯一标识(此时集群就不是事了)。甚至,经服务器允许后,多个客户端通过共享唯一标识,也可以共享会话;当然会话管理服务器、验证码服务器、业务服务器也可以是不同的服务器。