下面是关于Session的生命周期的一段常见描述
Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session"活跃(active)"了一次。服务器真的会自动创建Session吗?是tomcat这种容器帮我们做了吗?其实这种说法不是很准确
我们经常会写这样一段代码:
HttpSession session = request.getSession();
有些同学还知道这个方法有个重载,也可以这样写:
HttpSession session = request.getSession(true); 或 HttpSession session = request.getSession(false);
那这些有什么区别?官方解释如下:
true : 当session == null 时创建一个新的session
false : 返回当前的session
request.getSession(); 等同于 request.getSession(true);
这个解释一直让我很费解,我一直认为session是不会为null的,今天仔细查了一个资料,自己也亲自测试了一把,原来我一直的想法大错特错了
session是服务器建立的,但服务器不会主动建立,当一个请求过来时,服务器并不会建立一个session,而是要这样:
request.getSession();
当我们用程序通知服务器时它才会建立一个会话。
在jsp文件中有一个默认的属性 <%page session="true" />,翻译成java后就是:
session = pageContext.getSession();
所以当我们访问一个jsp文件的时候,如果没有去更改这个默认值,那也会建立一个会话,这也是大多数人会认为自动创建session的原因了,其实还是相当于我们主动通知服务器去创建
综上所述:
Tomcat这类服务器不会自动的创建session,只有当我们主动通知它时,才会创建会话