尝试运行HttpServletRequest的getSession()时,Web容器会创建HttpSession对象,关键在于每个HttpSession对象都会有个特殊的ID,称为Session ID,你可以执行HttpSession的getId()来取得Session ID。这个Session ID默认会使用Cookie存放在浏览器中。
每一个HttpSession各有特殊的Session ID,当浏览器请求应用程序时,会将Cookie中存放的Session ID一并发送给应用程序,Web容器会根据Session ID来找出对应的HttpSession对象,这样就可以取得各浏览器的会话数据。
所以使用HttpSession来进行会话管理时,设定为属性的对象是存储在服务器端,而Session ID默认使用Cookie存放于浏览器端。Web容器存储Session ID的Cookie“默认”为关闭浏览器就失效,所以重新启动浏览器请求应用程序时,通过getSession()取得的是新的HttpSession对象。
ServletAPI中可以存放属性的三个地方:
HttpServletRequest、HttpSession和ServletContext
默认在关闭浏览器前,取得的HttpSession都是相同的实例。如果想在此次会话期间,直接让目前的HttpSession失效,可以执行HttpSession的invalidate()方法。一个使用的时机就是实现注销机制。