300

创建a 的时间/条件JSESSIONID是什么?

它是每个域吗?例如,如果我有一个 Tomcat 应用程序服务器,并且我部署了多个 Web 应用程序,JSESSIONID每个上下文(Web 应用程序)是否会创建不同的应用程序,或者只要它们是同一个域,它是否会在 Web 应用程序之间共享?

4

5 回答 5

357

JSESSIONID cookie 在创建会话时创建/发送。会话是在您的代码调用request.getSession()request.getSession(true)第一次创建时创建的。如果您只想获取会话,但如果它不存在则不创建它,请使用request.getSession(false)-- 这将返回一个会话或null. 在这种情况下,不会创建新会话,也不会发送 JSESSIONID cookie。(这也意味着会话不一定是在第一次请求时创建的……您和您的代码在创建会话处于控制之中)

会话是每个上下文的:

SRV.7.3 会话范围

HttpSession 对象的范围必须在应用程序(或 servlet 上下文)级别。底层机制,例如用于建立会话的 cookie,对于不同的上下文可以是相同的,但引用的对象,包括该对象中的属性,决不能由容器在上下文之间共享。

Servlet 2.4 规范

更新:如果还没有会话,则每次调用 JSP 页面都会隐式创建一个新会话。这可以使用 page 指令关闭session='false',在这种情况下会话变量在 JSP 页面上根本不可用。

于 2009-02-28T23:56:07.183 回答
54

JSESSIONID以下是有关另一种cookie来源的一些信息:

我只是在调试一些在 tomcat 服务器上运行的 Java 代码。我没有request.getSession()在代码中的任何地方显式调用,但我注意到JSESSIONID仍在设置 cookie。

终于在Tomcat下的work目录下看了一下生成的Java代码对应一个JSP。

看来,无论您喜欢与否,如果您从 servlet 调用 JSP,JSESSIONID就会被创建!

补充:我刚刚发现通过添加以下 JSP 指令:

<%@ page session="false" %>

JSESSIONID您可以通过 JSP禁用设置。

于 2009-09-29T17:33:14.750 回答
25

更正:请为 Peter Štibraný 的答案投票 - 它更正确、更完整!

“JSESSIONID”是 http 会话的唯一 ID -请参阅此处的 javadoc。在那里,您会找到以下句子

会话信息的范围仅限于当前的 Web 应用程序 (ServletContext),因此存储在一个上下文中的信息在另一个上下文中不会直接可见。

因此,当您第一次访问站点时,会创建一个新会话并将其绑定到 SevletContext。如果您部署多个应用程序,则不会共享会话。

您还可以使当前会话无效,从而创建一个新会话。例如,当从 http 切换到 https(登录后)时,创建一个新会话是一个非常好的主意。

希望,这回答了你的问题。

于 2009-02-28T23:47:40.963 回答
8

请注意您的页面是否包含其他 .jsp 或 .jspf(片段)!如果你不设置

<%@ page session="false" %>

同样,在它们上,父页面最终将启动一个新会话并设置 JSESSIONID cookie。

特别是对于 .jspf 页面,如果您使用以下代码段配置 web.xml,则会发生这种情况:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

为了在其中启用scriptlet。

于 2013-06-19T16:47:15.623 回答
2

对于在带有自定义标签的 JSP 中生成的链接,我不得不使用

<%@ page session="false" %>

在 JSP 中

request.getSession().invalidate();

在 Struts 动作中

于 2009-10-09T21:08:04.530 回答