在使用HttpSession进行会话管理十分方便,让Web应用程序看似可以“记得”浏览器发出的请求,连接数个请求间的关系。但是无论如何,Web应用程序基于HTTP协议的事实并没有改变,实际上如何“取得”数个请求间的关系,这件工作是由Web容器帮你执行。
getSession()
当运行HttpServletRequest的**getSession()**时,Web容器会创建HttpSession对象,每个HttpSession对象都会有一个特殊ID,称为Session ID,其值可以通过HttpSession对象的getId()取得,Session ID默认使用Cookie存放在浏览器。在Tomcat中,Cookie的名称是JSESSIONID,数值则是getId()所取得的SessionID
HttpSession对象
但是由于Web容器本身是执行于JVM中的一个java程序,通过getSession()取得HttpSession,是Web容器中的一个java对象,HttpSession中存放的属性,自然也就存放于服务端的Web容器之中。当浏览器请求应用程序时,会将cookie中存放的Session ID一并发给应用程序,Web容器会根据Session ID来找到对应的HttpSession对象,这样就可以取得个浏览器个别的会话数据。所以使用HttpSession来进行会话管理时,设定为属性的对象时存储在服务器端,而Session ID默认使用的Cookie存放于浏览器端。Web容器存储Session ID的Cookie“默认”为关闭浏览器就失效,所以重新启动浏览器请求应用程序时,通过getSession()取得的是新的HttpSession对象。
每次请求来到应用程序,容器会根据发送过来的Session ID取得对应的HttpSession。(而在一种getSession方法中,传入的是布尔值,默认为true,若尚未存在HttpSession实例时,创建一个新的对象,而若为false,则直接返回null)由于HttpSession对象会占用内存空间,所以HttpSession的属性中尽量不要存储耗资源的大型对象,必要时将属性移除,或者不需使用HttpSession时,执行**invalidate()**让HttpSession失效。
Session的工作原理总结
当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session,并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中,当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问,服务器会根据这个SessionID去查看是否有对应的Session对象,有就拿出来使用;没有则创建一个Session
Httpsession的管理
因为http协议是无状态的,所以理论上浏览器的任何一次请求都会去生成一个新的sessionid.但是事实上我们访问网页的时候并不需要每次链接到一个新页面(同一个app)的时候都要重新输入用户名密码,如果是这样的话,互联网应该也发展不到今天。 所以这里就涉及到了httpsession的会话管理。httpsession现在都有服务端容器来管理。用户访问网页以后,服务端会生成一个sessionid,服务器就会根据这个sessionid来判断是不是一个全新的请求。默认情况下,服务端存储的sessionID的cookie被设计成关闭浏览器 sessionid就会失效。这也就是说我们这边同一个人在访问一个网站的时候,只要不关闭浏览器或者只要在session没过期的情况下,服务端就可以知道你是在同一个会话里面。直到session过期或者浏览器关闭,服务端才会给你生成一个新的sessionid