在啥条件下创建 JSESSIONID?

Posted

技术标签:

【中文标题】在啥条件下创建 JSESSIONID?【英文标题】:Under what conditions is a JSESSIONID created?在什么条件下创建 JSESSIONID? 【发布时间】:2010-10-10 09:35:55 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

“JSESSIONID”是 http 会话的唯一 ID - see the javadoc here。在那里,您会找到以下句子

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

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

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

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

【讨论】:

明确说明会话范围。 @Mo 链接坏了【参考方案2】:

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

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

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

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

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

<%@ page session="false" %>

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

【讨论】:

换句话说:页面会话属性的默认值为“true”。在某些(很多?)情况下,这可能是出乎意料的。 我也在tomcat上,根本不使用jsp,但是还是创建了会话cookie。知道在这种情况下如何防止它吗?【参考方案3】:

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

会话是每个上下文的:

SRV.7.3 会话范围

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

(Servlet 2.4 specification)

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

【讨论】:

不能在没有明确调用 getSession 的情况下创建会话吗?关于“容器不得在上下文之间共享”,websphere 有一个共享会话的选项,这是问题的动机:) 如果您只使用 Servlet API,则不会。不过,可能存在特定于服务器的扩展(如您指出的 Websphere 的会话共享)。 如果您的 标签包含 cookies 属性,我相信您的 context.xml 文件可以控制自动会话创建,例如 现在我在我的过滤器上获得了很多点击以创建会话,并且似乎只有在第二次点击(不是第二次页面刷新)之后才创建它,这引起了我的注意“会话不一定在第一次请求时创建..”是否相关?你能举个例子,为什么这不一定是在第一次请求时创建的?谢谢! @jpganz18:如果您只是调用request.getSession()request.getSession(true),那么您将获得现有会话或新会话。但是,如果您的代码调用 request.getSession(false),那么您将获得现有会话或 null(如果不存在会话)。【参考方案4】:

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

<%@ page session="false" %>

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

特别是对于 .jspf 页面,如果您使用这样的 sn-p 配置 web.xml,就会发生这种情况:

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

为了在其中启用 scriptlet。

【讨论】:

您的意思是在包含的所有片段(.jsp 和 .jspf)中设置页面 session=false,而不是将其包含在包含其余 sn-ps 的主 jsp 中?【参考方案5】:

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

<%@ page session="false" %>

在 JSP 中

request.getSession().invalidate();

在 Struts 动作中

【讨论】:

以上是关于在啥条件下创建 JSESSIONID?的主要内容,如果未能解决你的问题,请参考以下文章

无状态弹簧应用程序 - JSESSIONID 仍然生成

CCmdTarget::OnFinalRelease 在啥条件下被调用?

从 servlet 读取整个 url

ARC 会在啥条件下保留该对象?

HttpClient.DefaultRequestHeaders.ExpectContinue。 ExpectContinue 服务于啥目的以及在啥条件下将其设置为 true 或 false。

MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?