Session技术是管理浏览器和服务器间会话过程中产生的会话数据的一种技术。然而,不同的服务器之间产生的会话数据,或者同一浏览器重新打开所产生的会话数据,服务器是无法管理的。
我们知道,与Cookie技术相比,Session技术是将会话数据存放在服务器端的一种会话管理技术,session对象是作为域对象来保存数据的,因此,可以从session对象取出数据必须是存放数据的sessinon对象。下面来分析服务器如何识别所保存的session对象时具有唯一性的的。
当Session第一次被创建时,服务端会给它一个唯一的标记id,并且将这个id发给浏览器,当浏览器再次访问服务器时,会将id带过去。服务器使用这个id找到对应的那个session对象。
那么,这个唯一的标记id是如何发送给浏览器的呢?
接下来我们做一个实验,编写两个简单的Servelet:
SessionDemo1:
创建Session并写入数据
SessionDemo2:
读取Session中的数据
首先,我们运行SessionDemo1发出请求,打开Firebugs查看响应信息:
我们可以看到,响应中有一个名为JSESSIONID的标记,这是服务器在浏览器产生的一个cookie。我们单独拿出来。
JSESSIONID=76651E73730D8FC4A89831519578A6F5
接下来,我们运行SessionDemo2发出请求,打开Firebugs查看响应信息:
我们发现,cookie中也有一个JESSIONID字段。
Cookie JSESSIONID=76651E73730D8FC4A89831519578A6F5
这个字段与在SessionDemo1中产生的字段是一致的,通过这种方法,服务器可以以做出判断,在SessionDemo2中取出的Session对象,正是SessionDemo1存储在服务器中的那个Session对象。
Session会话管理技术原理总结如下:
1)服务器创建Session对象,服务器会给这个session对象分配一个唯一的标记JSESSIONID
2)把JSESSIONID作为Cookie发送给浏览器
3)浏览器得到JSESSIONID保存下来,在下次访问时携带这个JSESSIONID去访问服务器
4)服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSSESSINOID的session对象,
5)如果找到,则返回这个session对象
6)如果找不到,可能直接返回null,或者再创建新的session对象。