1. 会话技术
会话跟踪是web中最常用的技术,用来跟踪用户的整个会话操作。由于http请求是无状态的,每次用户请求都需要创建一个连接,当请求结束时,连接就会被关闭。当下次请求时,服务器就无法得知与上次请求是否为同一用户。这时候就需要用到会话跟踪来对用户行为进行跟踪。常用的会话跟踪技术有Cookie和Session。Cookie在客户端记录用户信息,Session则在服务端记录用户信息来确定用户身份。
2. Cookie
1. 生成机制
Cookie其实就是由服务器发送给客户端的特殊信息,这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。
具体有一下步骤:
当用户使用一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息到服务器
服务器向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体中,而是存放在HTTP响应头
当客户端浏览器接收到来着服务器的响应之后,浏览器在特定的位置会存放这些信息。
以后客户端再向服务器发送请求时都会把相应的Cookie放在HTTP请求头中,再次发回至服务器。
通信过程示意图
2. 理解
如果你把Cookies看成为http协议的一个扩展的话,理解起来就容易的多了,其实本质上cookies就是http的一个扩展。有两个http头部是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个http响应信息时,其中如果包含Set-Cookie这个头部时,意思就是指示客户端建立一个cookie,并且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过期。如果cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。另外一种情况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。
客户端发送一个http请求到服务器端 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部 客户端发送一个http请求到服务器端,其中包含Cookie头部 服务器端发送一个http响应到客户端
3. 生命周期
Cookie有两种存储方式,可以存储在浏览器内存中或者存储在磁盘里。存储在内存中的Cookie将随着浏览器的关闭而消息,而存储在磁盘中的Cookie则为永久存储,由过期时间控制
Cookie的maxAge决定着Cookie的有效期,单位为秒
Cookie中通过getMaxAge()方法与setMaxAge()方法来读写maxAge属性。如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动消失。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1
如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除
3. Session
1. 概念
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
2. 生命周期
Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session存放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量用户访问服务器时可能会导致内存溢出,所以Session里的信息应该尽量精简。
Session在用户第一次访问服务器的时候自动创建。需要注意的是只有访问Servlet、PHP、JSP等后端服务时才会创建Session,只访问HTML、JS等静态资源并不会创建Session。
ession生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃“了一次。
服务器设有默认的Session过期时间,到了时间服务器会把长时间没有活跃的Session从内存中删除。也可以自己自定义Session的过期时间。
3. Session与Cookie
虽然Session保存在服务器,对客户端是透明的,但是它的正常运行仍然需要客户端浏览器Cookie的支持。这是因为Session需要Cookie作为识别标识。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此当服务器创建Session时会向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id,服务器根据每次客户端发送来的Cookie里的JSESSIONID来判断是否为同一用户。因此如果存储JSESSIONID的Cookie丢失,那么即使服务器的Session任未过期,也无法使用。