HttpSession原理
当客户端第一次访问服务器的时候,此时客户端的请求中不携带任何标识给服务器,所以此时服务器无法找到与之对应的session,所以会创建一个新的session对象,当服务器进行响应的时候,服务器会将session标识(即SessionID)放到响应头的Set-Cookie中,会以key-value的形式返回给客户端,例:JSESSIONID=7F149950097E7B5B41B390436497CD21
;其中JSESSIONID
是固定的,而后面的value值对应的则是给该客户端新创建的session的ID,之后浏览器再次进行服务器访问的时候,客户端会将此key-value放到cookie中一并请求服务器,服务器就会根据此ID寻找对应的session对象了;(当浏览器关闭后,会话结束,由于cookie消失所以对应的session对象标识消失,而对应的session依然存在,但已经成为报废数据等待GC回收了)对应session的ID可以利用此方法得到:session.getId();
建立连接时生成的cookie:
后面再次发送请求时会携带cookie,利用cookie中的sessionID可以查找到对应的session:
需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session与B用户和C服务器建立连接时所处的Session是两个不同的Session。
域的范围:
Context域 > Session域 > Request域
Session域 只要会话不结束就会存在 但是Session有默认的存活时间(30分钟)
HTTPSession工作流程
- Client第一次发送请求,web container生成唯一的session ID(生成session
ID的源码可以看下tomcat源码, 随机数+时间+jvmid),并将其返回给client(在web container返回给client的response中),web container上的这个HttpSession是临时的。 - 后面Client在每次发送请求给服务器时,都将session ID发送给web container,这样web container就很容易区分出是哪个client.
- Web container使用这个session ID,找到对应的HttpSession,并将此次request与这个HttpSession联系起来。
HTTPSession生命周期
1. 什么时候创建HttpSession ?
1).对于JSP:
是否浏览器访问服务端的任何一个JSP或Servlet,服务器都会立即创建一个HttpSession对象呢? 不一定。
①.若当前的JSP或(Servlet)是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性为false,则服务器就不会为JSP创建一个HttpSession对象;
②.若当前JSP不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象,则服务器也不会为当前JSP创建一个新的HttpSession对象,而会把和当前会话关联的那个HttpSession对象返回给当前的JSP页面。
2).对于Servlet而言:
若Servlet是客户端访问的第一个WEB应用的资源,则只有调用了request.getSession()或request.getSession(true) 才会创建HttpSession对象
3). 在Servlet中如何获取HttpSession对象?
request.getSession(boolean create):create为false,若没有和当前JSP页面关联的HttpSession对象,则返回null;
若有返回true create为true一定返回一个HTTPSession对象。若没有和昂前JSP页面关联的HttpSession对象,则服务器创建一个新的HttpSession对象返回,若有,则直接返回关联。
request.getSession()等同于request.getSession(true)
2. 什么时候销毁HttpSession对象?
1).直接调用HttpSession的invalidate() 方法使HttpSession失效。
2).服务器卸载了当前Web应用。
3).超出HttpSession的过期时间。