在什么条件下创建JSESSIONID?


276

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

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

Answers:


324

创建会话时,将创建/发送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'page指令将其关闭,在这种情况下,会话变量在JSP页面上根本不可用。


2
无法显式调用getSession来创建会话吗?关于“绝不能在容器之间的上下文之间共享”,websphere可以选择共享会话,这是提出问题的动机:)
joshjdevl

如果仅使用Servlet API,则不会。但是,可能会有特定于服务器的扩展(例如,您指出的Websphere会话共享)。
PeterŠtibraný09年

我相信,如果您的<Context>标记包含cookie属性,例如,<Context cookies =“ false”>
BT

现在,即时消息在我的过滤器上获得了很多匹配,以创建会话,并且似乎只有在创建第二个匹配(而不是刷新第二个页面)之后,这才引起我的注意,“会话不一定是在第一个请求上创建的。”是有关系吗?您能否举个例子说明为什么不一定要在第一次请求时创建它?谢谢!
jpganz18

@ jpganz18:如果您仅调用request.getSession()request.getSession(true),那么您将获得现有会话或新会话。但是,如果您的代码调用request.getSession(false),那么您将获得现有会话,或者如果不存在会话,则为null。
PeterŠtibraný17年

49

以下是有关JSESSIONIDCookie的另一个来源的一些信息:

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

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

看来,无论您是否喜欢,如果您从Servlet调用JSP,JSESSIONID都会被创建!

补充:通过添加以下JSP指令,我发现了这一点:

<%@ page session="false" %>

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


3
换句话说:页面会话属性的默认值为“ true”。在某些情况下(很多情况下),这可能是意外的。
DavidBalažic2015年

我也在使用tomcat,我根本不使用jsp,但是无论如何都会创建会话cookie。知道如何在这种情况下防止它吗?
ClassyPimp

23

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

“ JSESSIONID”是http会话的唯一ID,请参见此处的javadoc。在那里,您会发现以下句子

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

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

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

希望这能回答您的问题。


1
会话范围的清晰说明。
user3123690 2014年

@Mo链接已断开
Timofey

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。


您是说要在所有包含的片段(.jsp和.jspf)中设置页面session = false,而不是将其包含在包含其余代码片段的主jsp中?
Ommadawn

2

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

<%@ page session="false" %>

在JSP中

request.getSession().invalidate();

在Struts动作中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.