13

java servlet中的HttpSession是否仅在之后创建

HttpSession s = request.getSession();

?

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

4

5 回答 5

17

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

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

你在使用 JSP 吗?

于 2011-02-28T10:15:23.833 回答
15

阅读 JavaDocs,它清楚地说:

这就是说,request.getSession()

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

而另一个变体request.getSession(isCreate)

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

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

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


更新

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

参考:

  1. Java 文档HttpSession
  2. JavaRaunch 讨论:HttpSession 是自动创建的吗?

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

于 2011-02-28T10:10:59.547 回答
3

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

于 2011-02-28T10:13:49.753 回答
1

要使其完整:

  • session 不会创建,除非您request.getSession()在 servlet 中调用,用于在request.getSession(false)不创建新会话的情况下获取现有会话
  • 如果您使用 JSP 页面,会话会自动为您创建 - 变量session- 除非您指定<%@ page session="false" %>
  • 即使您的会话是自动创建的,您也可以使用session.isNew()它来查找它是否是新创建的
于 2012-11-02T14:05:02.057 回答
0

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

于 2011-02-28T10:08:56.737 回答