在什么情况下JSESSIONID创建?

什么时候创建JSESSIOINID的条件是什么?

它是每个域? 例如,如果我有一个Tomcat应用程序服务器,并且我部署了多个Web应用程序,那么会根据上下文(Web应用程序)创建不同的JSESSIONID ,还是跨Web应用程序共享,只要它们是相同的域?

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'页面指​​令来关闭,在这种情况下,session变量在JSP页面上根本不可用。

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

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

我终于看到了在Tomcat下的工作目录中对应于JSP的生成的Java代码。

看来,不管你JSESSIONID不喜欢,如果你从一个servlet调用一个JSP, JSESSIONID将被创建!

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

 <%@ page session="false" %> 

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

更正:请投票选举PeterŠtibraný的回答 – 这是更正确和完整的!

“JSESSIONID”是http会话的唯一标识符 – 请参阅此处的javadoc 。 在javadoc中,您将看到以下语句:“会话信息仅限于当前Web应用程序(ServletContext),因此存储在一个上下文中的信息将不会在另一个上下文中直接显示。

所以当你第一次点击一个网站,一个新的会话被创建并绑定到SevletContext。 如果您部署多个应用程序,则会话不会共享。

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

希望,这回答你的问题。

请注意,如果您的网页包含其他.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> 

为了启用里面的脚本。

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

 <%@ page session="false" %> 

在JSP中

 request.getSession().invalidate(); 

在Struts行动