在什么条件下创建JSESSIONID ?

创建JSESSIONID时的条件是什么?

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

448345 次浏览

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

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

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

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

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

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

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

会话是基于上下文的:

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中

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。