日期:2014-05-16  浏览次数:20442 次

Servlet/JSP之“Cookie和Session原理
由于HTTP协议的无状态特征,Web应用中经常使用Cookie和Session来保存用户在与系统交互过程中的状态数据。下面通过分析HT-TP协议对Cookie和Session的工作原理加以了解。

一、Cookie

[ 转自铁血社区 http://bbs.tiexue.net/ ]
Cookie的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。

 

Cookie可以用于保持用户的会话状态,但Cookie信息保存在客户端,存在较大的安全隐患,且一般浏览器对Cookie的数目及数据大小有严格的限制。在Web应用中,一般情况下通过对象保持会话状态。

 

二、Session

Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销。

[ 转自铁血社区 http://bbs.tiexue.net/ ]
存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享一个Session对象,因为这些请求携带了相同的SessionID信息。

当浏览器请求地址“.../tst/testSession?option=create”时,Servlet调用request的getSession方法获得Session对象,如果此时服务器端存在与请求信息中SessionID(作为Cookie信息携带)对应的Session对象,则返回这个Session对象,否则将会创建一个新的Session对象并将其产生的SessionID以Cookie的形式通过响应信息送回。注意,Session对象的setMaxInactiveInterval方法用于设置最长不活动间隔,单位是秒,如果出现在这个的时间段内Session对象没有被存取,则该Session对象将会失效。通常为了保证服务器的性能和出于安全性考虑,这个值要妥善的设置(Tomcat针对Session的MaxInactiveInterval会有默认的设置)。若setMaxInactiveInterval设置为负值,则表示该Session永不过期。另外,Session对象分别通过setAttribute和getAttribute方法存取数据,数据以“名称-对象”对的形式存放。该请求对应的请求和响应的HTTP信息为:

请求:

当浏览器请求“.../tst/testSession?option=invalidate”时,Servlet会调用Session对象的invalidate方法用于使该Session对象失效。需要注意的是,此时获取Session对象的方法为重载的getSession(boolean b)其中boolean类型的参数表示当前请求没有和服务器端的某个Session对象关联时是创建新的Session(参数为true时)还是返回null(参数为false时)。

 

 

[ 转自铁血社区 http://bbs.tiexue.net/ ]
3、Session对象的持久化

对于一个企业级应用而言,Session对象的管理十分重要。Sessio对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为Session对象的持久化。Session对象在持久化时,存放在其中的对象以序列化的形式存放,这就是为什么一般存放在Session中的数据需要实现可序列化接口(java.io.Serializable)的原因了。

Tomcat 5.5 服务器提供两个类用于Session对象的管理,这两个类分别是org.apache.catalina.session.StandardManager 和 org.apache.catalina.session.PersistentManager。Tomcat默认的方式是使用StandardManager来管理Session。Tomcat 5.5默认会在服务器关闭或应用重新加载时建立一个名为session.ser的文件,并将该应用对应的Session对象存放在其中,该文件位于“Tomcat主目录\work\Catalina\ localhost\应用名”路径下。注意,当Tomcat重新启动或应用重新加载后会读取这个文件,载入其中的Session信息,然后把它删掉,所以如果看不到该文件是由于时机不对或者眼力不够快。




通过Context元素的子元素Manager配置Session的管理对象:

className属性用于指定管理Session的类可以是StandarManager或PersitentManager。

maxActiveSessions表示允许最多活动Session对象的数目,-1表示不限制。

[ 转自铁血社区 http://bbs.tiexue.net/ ]
maxInactiveInterval表示Session默认的最长不活动间隔,单位为秒。

pathname表示StandarManager在服务器重启或应用重新加载时持久化Session对象的文件名,此处设置为“”相当于关掉了Session的持久化机制。