2011-02-28 52 views
12

是HttpSession中的Java Servlet的仅的Java HttpSession中

HttpSession s = request.getSession(); 

后产生的?

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

+1

你是什么意思'它不起作用?你有例外吗?如果你的测试返回与null不同的东西,这意味着该会话已经存在,并且不需要创建一个新的。 – reef 2011-02-28 10:09:19

+0

所以你得到request.getSession(false)!= null。 – PeterMmm 2011-02-28 10:11:05

+0

我的意思是(request.getSession(false)== null)应该是真的,但它是假的,我不知道为什么 – Sergey 2011-02-28 10:11:13

回答

16

调用request.getSession()时会创建HttpSession。<%@ page session="false">

是否使用JSP:

如果您在默认情况下访问JSP会自动创建一个session.This行为可以通过禁用?

+0

非常感谢,它帮助 – Sergey 2011-02-28 10:21:44

+0

这似乎也从页面请求中删除会话(如果存在的话)。 – 2012-09-12 20:10:25

+0

leif8:不,它不会从我的页面中删除会话 – peenut 2012-11-02 13:57:17

0

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

15

读的JavaDoc,上面清清楚楚地写着:

此说,request.getSession()

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

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

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

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

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


更新

对位的研究,我发现,会话是创建除非request.getSession()被称为地方。由于,The servlet container uses this interface to create a session between an HTTP client and an HTTP server.默认情况下,您的Servlet容器很有可能会为您创建会话。

参考:

  1. Java文档HttpSession
  2. 论JavaRaunch:is HttpSession created automatically?

但是,更安全侧,使用request.getSession()来获取会话,并使用request.getSession(false)只有当你需要验证一个会话是否已经创建。

+0

这就是问题所在。我不创建任何HttpSession。我不使用request.getSession()。我第一次检查它是if(request.getSession(FALSE)== null)它应该是true,但它不是 – Sergey 2011-02-28 10:14:44

+0

'request.getSession()'不是创建HTTP会话的唯一方法。 – Nishant 2011-02-28 10:16:53

+0

其他是什么? – Sergey 2011-02-28 10:17:54

3

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

1

为了使它完成:

  • 会话没有创建,除非你调用request.getSession(),在你的servlet,使用request.getSession(false)获得,而无需创建新的会话
  • 现有会话,如果你使用JSP页面,会话自动为您创建 - 变量session - 除非您指定<%@ page session="false" %>
  • 即使您的会话是自动创建的,您可以使用session.isNew()找出它是否已新创建