前两天在写一个 Servlet 的时候遇到一件特别奇怪的事情,就是我明明已经设置了 HttpSession session = request.getSession(false),但是我在第一次发起请求的时候,打印出 session 确实是 null,但是我第二次再发起请求时,session 却能够打印出来值了,我真是百思不得其解,因为按道理来说无论如何,这个 session 都应该依然是 null 才对。

后来问题解决了,其根本原因是我在这个请求的后面的阶段又访问了一个 JSP 页面,因为在 JSP 页面存在一个隐式的 HttpSession session = request.getSession(true),所以无论我在前面如何设置,在后面请求到达 JSP 页面的时候都会使得 session 不为空,这也就解释了为什么我第一次发起请求的时候 session 为空,而后面的请求 session 就不为空了。解决方法也很简单,只要在 JSP 页面设置 <%@ page language="java" session="false"%>,这样一来,在 JSP 页面就禁用掉了 session,也就是 JSP 页面不再存在隐式的存在HttpSession session = request.getSession(true)这行代码了。所以此时的 session 只能够在 Servlet 中被取得,同时 Servlet 中又不再创建新的 session,所以自然 session 就不会再莫名其妙的被创建出来了。