Java HttpSession

是否在java servlet中创建了HttpSession

HttpSession s = request.getSession(); 

在我的代码中我没有写那个,但是当我使用if (request.getSession(false) == null) ... ,它不起作用。 为什么?

调用request.getSession()时会创建一个HttpSession。

但是,如果您默认访问JSP,它将自动创建<%@ page session="false">可以使用以下命令禁用此行为: <%@ page session="false">

你在使用JSP吗?

阅读JavaDocs,它清楚地说:

这就是说, request.getSession()

返回与此请求关联的当前会话,或者如果请求没有会话,则创建一个会话。

另一个变量request.getSession(isCreate)

返回与此请求关联的当前HttpSession,如果没有当前会话且create为true,则返回新会话。

如果create为false且请求没有有效的HttpSession,则此方法返回null。

要确保正确维护会话,必须在提交响应之前调用此方法。 如果容器使用cookie来维护会话完整性,并且在响应提交时要求创建新会话,则抛出IllegalStateException。


更新

在一点研究中,我发现除非在某处调用request.getSession()否则不会创建Session。 因为, The servlet container uses this interface to create a session between an HTTP client and an HTTP server. 您的Servlet容器很可能默认为您创建会话。

参考:

  1. Java Doc HttpSession
  2. 关于JavaRaunch的讨论: HttpSession是自动创建的吗?

但是,为了更安全,请使用request.getSession()来获取会话,并仅在需要validation是否已创建会话时使用request.getSession(false)

除了Nishant的答案之外,会话可以由JSP页面隐式创建,除非您将它们配置为不使用<%@ page session = "false" %>创建会话。

为了完成它:

  • 除非在servlet中调用request.getSession() ,否则不创建会话,使用request.getSession(false)来获取现有会话而不创建新会话
  • 如果你使用JSP页面,会自动为你创建session – 变量session – 除非你指定<%@ page session="false" %>
  • 即使您的会话是自动创建的,您也可以使用session.isNew()来查找(如果它是新创建的)

尝试从浏览器中删除会话cookie并进行另一次测试。 如果它不起作用,则其他组件在该调用之前创建新会话。