创建 JSESSIONID 时的条件是什么?
JSESSIONID
是按域名吗?例如,如果我有一个Tomcat应用服务器,并且我部署了多个Web应用程序,那么每个上下文(Web应用程序)是否会创建不同的 JSESSIONID ,或者只要它们是同一个域,它是否可以跨Web应用程序共享?
请注意,如果您的页面包含其他.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中生成的链接,我必须使用
在JSP中
和
request.getSession().invalidate();
在Struts动作中
创建会话时创建/发送JSESSIONID cookie . 当您的代码第一次调用 request.getSession() 或 request.getSession(true) 时创建会话 . 如果您只想获取会话,但如果它不存在则不创建会话,请使用 request.getSession(false) - 这将返回会话或 null . 在这种情况下,不会创建新会话,也不会发送JSESSIONID cookie . (这也意味着 session isn't necessarily created on first request ...您和您的代码在创建会话时处于控制之中)
request.getSession()
request.getSession(true)
request.getSession(false)
null
会话是根据具体情况:
SRV.7.3会话范围HttpSession对象必须在应用程序(或servlet上下文)级别确定范围 . 底层机制(例如用于 Build 会话的cookie)对于不同的上下文可以是相同的,但引用的对象(包括该对象中的属性)决不能由容器在上下文之间共享 .
(Servlet 2.4 specification)
更新:如果还没有会话,则每次调用JSP页面都会隐式创建一个新会话 . 可以使用 session='false' page指令关闭它,在这种情况下,会话变量在JSP页面上根本不可用 .
session='false'
以下是有关 JSESSIONID cookie的另一个来源的一些信息:
我只是在调试一些在tomcat服务器上运行的Java代码 . 我没有在我的代码中的任何地方明确地调用 request.getSession() 但是我注意到仍然设置了一个 JSESSIONID cookie .
我终于看一下Tomcat下工作目录中与JSP相对应的生成的Java代码 .
看来,无论你喜欢与否,如果从servlet调用JSP,都会创建 JSESSIONID !
补充:我刚刚发现添加以下JSP指令:
您可以通过JSP禁用 JSESSIONID 的设置 .
更正:请投票给PeterŠtibraný的答案 - 它更正确,更完整!
"JSESSIONID"是http会话的唯一ID - see the javadoc here . 在javadoc中,您将找到以下句子:"Session information is scoped only to the current web application (ServletContext), so information stored in one context will not be directly visible in another."
因此,当您第一次访问某个站点时,会创建一个新会话并绑定到SevletContext . 如果部署多个应用程序,则不会共享会话 .
您还可以使当前会话无效,从而创建一个新会话 . 例如当从http切换到https(登录后)时,创建一个新会话是一个非常好的主意 .
希望,这回答了你的问题 .
5 回答
请注意,如果您的页面包含其他.jsp或.jspf(片段)!如果你没有设置
同样,父页面将结束新会话并设置JSESSIONID cookie .
特别是对于.jspf页面,如果您使用这样的代码段配置web.xml,就会发生这种情况:
为了在其中启用scriptlet .
对于使用自定义标记在JSP中生成的链接,我必须使用
在JSP中
和
在Struts动作中
创建会话时创建/发送JSESSIONID cookie . 当您的代码第一次调用
request.getSession()
或request.getSession(true)
时创建会话 . 如果您只想获取会话,但如果它不存在则不创建会话,请使用request.getSession(false)
- 这将返回会话或null
. 在这种情况下,不会创建新会话,也不会发送JSESSIONID cookie . (这也意味着 session isn't necessarily created on first request ...您和您的代码在创建会话时处于控制之中)会话是根据具体情况:
(Servlet 2.4 specification)
更新:如果还没有会话,则每次调用JSP页面都会隐式创建一个新会话 . 可以使用
session='false'
page指令关闭它,在这种情况下,会话变量在JSP页面上根本不可用 .以下是有关
JSESSIONID
cookie的另一个来源的一些信息:我只是在调试一些在tomcat服务器上运行的Java代码 . 我没有在我的代码中的任何地方明确地调用
request.getSession()
但是我注意到仍然设置了一个JSESSIONID
cookie .我终于看一下Tomcat下工作目录中与JSP相对应的生成的Java代码 .
看来,无论你喜欢与否,如果从servlet调用JSP,都会创建
JSESSIONID
!补充:我刚刚发现添加以下JSP指令:
您可以通过JSP禁用
JSESSIONID
的设置 .更正:请投票给PeterŠtibraný的答案 - 它更正确,更完整!
"JSESSIONID"是http会话的唯一ID - see the javadoc here . 在javadoc中,您将找到以下句子:"Session information is scoped only to the current web application (ServletContext), so information stored in one context will not be directly visible in another."
因此,当您第一次访问某个站点时,会创建一个新会话并绑定到SevletContext . 如果部署多个应用程序,则不会共享会话 .
您还可以使当前会话无效,从而创建一个新会话 . 例如当从http切换到https(登录后)时,创建一个新会话是一个非常好的主意 .
希望,这回答了你的问题 .