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容器很可能默认为您创建会话。
参考:
- Java Doc HttpSession
- 关于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并进行另一次测试。 如果它不起作用,则其他组件在该调用之前创建新会话。