创建JSESSIONID的条件是什么?

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


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

“JSESSIONID”是http会话的唯一id——请看这里的javadoc。在那里,你会发现下面的句子

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

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

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

霍普,这回答了你的问题。


JSESSIONID cookie is created/sent when session is created. Session is created when your code calls request.getSession() or request.getSession(true) for the first time. If you just want to get the session, but not create it if it doesn't exist, use request.getSession(false) -- this will return you a session or null. In this case, new session is not created, and JSESSIONID cookie is not sent. (This also means that session isn't necessarily created on first request... you and your code are in control when the session is created)

会话是基于上下文的:

SRV.7.3会话范围 HttpSession对象必须限定在 应用程序(或servlet上下文) 的水平。潜在的机制,如 作为cookie用来建立 会话,可以相同为不同 上下文,但是引用的对象, 包括其中的属性 对象之间,绝不能共享 上下文的容器。

(Servlet 2.4规范)

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


下面是关于JSESSIONID cookie的另一个来源的一些信息:

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

最后,我查看了Tomcat下工作目录中与JSP对应的生成的Java代码。

不管您喜欢与否,如果您从servlet调用JSP,将会创建JSESSIONID !

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

<%@ page session="false" %>

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


对于在带有自定义标记的JSP中生成的链接,我必须使用

<%@ page session="false" %>

在JSP中

AND

request.getSession().invalidate();

在Struts动作中


如果您的页面包含其他.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。