1、Session的概念
使用Cookie和附加URL参数都可以将上次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。
Session技术是一种会话状态保存在服务器端的技术,它可以比喻成是医生发给病人的病历卡和医院为每个病人保留的病历档案的结合方式。
客户端需要接收、记忆和回送Session的会话标示号,Session可以且通常是借助Cookie来传递会话标示号。
2、Session的跟踪会话机制
Servlet API规范中定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会话状态的方法。
HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。
Web服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序是,Web应用程序才会创建一个与该客户端对应的HttpSession对象。
Web服务器为HttpSession对象分配一个独一无二的会话标示号,然后在响应消息中将这个会话标示号传递给客户端。客户端需要记住会话标示号,并在后续的每次访问请求中都把这个会话标示号传送给Web服务器,Web服务器程序依据回传的会话标示号就知道这次请求的客户端发出的,从而选择与之对应的HttpSession对象。
3、Session的跟踪机制
Web应用程序创建与某个客户端对应的HttpSession对象后,只要没有超出一个限定的空闲时段,HttpSession对象就驻留在Web服务器内存之中,该客户端此后访问任意的servlet程序时,它们都使用与客户端对应的那个已存在的Httpsession对象。
HttpSession接口中专门定义了一个SetAttribute方法将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在Httpsession对象中的对象,存储进Httpsession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。
Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当给客户的一个购物车。
4、Session的超时管理
Web服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,Web服务器还要保留与之对应的Httpsession对象。
随着时间的推移而不断增加新的访问客户端,Web服务器内存中将会因此积累起大量的不断不在使用的Httpsession对象,并将最终导致服务器内存耗尽。
Web服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,Web服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的Httpsession对象变成垃圾。
如果客户端浏览器超时后再发出访问请求,Web服务器则认为这是一个新的会话开始,将为之创新的HttpSession对象和分配新的会话标示号。
会话的超时间隔可以在Web.xml文件中设置,其默认值由Servlet容器定义。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5、HttpSession接口中的方法:
getId()方法
getCreationTime()方法
getLastAccessedTime()方法
setMaxInactiveInterval()方法
getMaxInactiveInterval()方法
isNew()方法
(*主如果客户端请求消息中返回了一个与Servlet程序当前获得的Httpsession对象的会话标识号相同的会话标示号,则认为这个Httpsession对象不是新建的。)
Invalidate()方法
getServletContext()方法
setAttribute()方法
getAttribute()方法
removeAttribute()方法
getAttribute()方法
HttpServletRequest接口中的Session方法
getSession()方法
publicHttpSession getSession(boolean create)
publicHttpSession getSession()
isRequestedSessionIdValid()方法
isRequestedSessionIdFromCookie()方法
isRequestedSessionIdFromURL()方法
6、利用Cookie实现Session跟踪
如果Web服务器处理某个访问请求是创建了新的Httpsession对象,它将把会话标识号作为一个Cookie项加入到响应消息中,通常情况下浏览器在随后发出的访问请求中又将会话标识号以Cookie的形式回传给Web服务器。
Web服务器端程序依据回传的会话标识号就知道以前已经为该客户端创建了Httpsession对象,不必要为该客户创建新的Httpsession对象,而是直接使用与该会话标识号匹配的HttpSession 对象,通过这种方式就实现了对同一个客户端的会话状态的跟踪。
7、利用URL重写实现Session跟踪
Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。
将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写。
HttpServletResponse接口中定义了两个用于完成URL重写方法:
ü encodeURL方法
ü encodeRedirectURL方法