提示:这里的session是指在基于javaEE开发中所用到的session

研究session生命周期即研究在客户端与服务器交互过程中session的创建、销毁时机以及session是怎样在客户端和服务器端保持一致状态,本文将通过对浏览器请求、响应报文信息分析的方式,拆解session的生命周期。

1.session的创建

session是在服务器端创建的,一个很常见的误区就是一旦客户端访问服务器资源,那么session就会被创建,但事实并非如此。只有访问jsp或者servlet时才有可能创建session,在访问HTML、图片等一些静态资源时,服务器是不会创建session的。下面我们分别通过访问jsp和servlet两个方面分析:

访问jsp:session是jsp的内置对象,在jsp被转换为servlet时会的通过session=pageContext.getSession();语句创建session。另外,jsp创建session可以在jsp页面进行的配置,如jsp页面有<%@ page session="false" %>的声明,那么请求jsp页面时也不会创建session的。

访问servlet:在servlet中只有通过HttpSession session=request.getSession();声明的情况下才会创建session,访问一个很普通servlet程序并不会创建session。


<span style="font-size:14px;">/**
 * 访问静态页面的servlet
 */
public class TestSessionServlet extends HttpServlet {
<span style="white-space: pre;">	</span>private static final long serialVersionUID = -7608452196932541863L;
<span style="white-space: pre;">	</span>@Override
<span style="white-space: pre;">	</span>protected void doGet(HttpServletRequest req, HttpServletResponse resp)
<span style="white-space: pre;">			</span>throws ServletException, IOException {
<span style="white-space: pre;">		</span>//访问静态页面不会创建session
<span style="white-space: pre;">		</span>RequestDispatcher rd = req.getRequestDispatcher("/pages/sessionTest/success.html");
<span style="white-space: pre;">		</span>rd.forward(req, resp);
<span style="white-space: pre;">	</span>}
}</span>

浏览器请求响应信息:


会话session的生命周期管理_会话session的生命周期管理



会话session的生命周期管理_session_02

由上图可知在访问静态资源和没有session显式声明的servlet时是不会创建session的。当servlet调用了getSession方法后会创建session,并将sessionId通过cookie返回到浏览器。浏览器所得的响应信息如下:

会话session的生命周期管理_会话session的生命周期管理_03

这里不再列举访问jsp时的情况。

2.session的销毁:

正常情况下,session只有在调用session.invalidate()和session过期时被销毁。session的有效时间是可配置的,可通过tomcat配置文件server.xml,项目文件web.xml和servlet代码三个地方对其进行设置。

3.session如何保持客户端和服务器端一致状态:

session是保存在服务器端的,但对客户端是透明的,这种机制是通过在客户端保存了sessionId的方式实现的。这有点类似于我们去银行办理业务,我们第一次去银行办理业务,银行会给我们分配一张银行卡,这张卡就相当于sessionId,可以通过它保持用户与银行账户信息的一致。以后存取款时,我们只需提供有效地银行卡。

而sessionId的分发一般情况下是通过cookie实现的,当浏览器第一次访问服务器,服务器创建session后会把sessionId以cookie的方式响应回来保存在本地,以后每次访问时,所有的cookie信息会被带到reques头信息中提交至服务器,如服务器判断该sessionId所对应的session在有效期内,则可获得session详细信息,反之则会创建新的session并将新的sessionId发送给客户端。

当然,分发sessionId的方法还有URL重写的方式实现,服务器会根据客户端是否支持cookie选择不同的方式保持session信息的一致。