在啥条件下创建 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 的会话共享)。 如果您的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?的主要内容,如果未能解决你的问题,请参考以下文章
CCmdTarget::OnFinalRelease 在啥条件下被调用?
HttpClient.DefaultRequestHeaders.ExpectContinue。 ExpectContinue 服务于啥目的以及在啥条件下将其设置为 true 或 false。
MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?