Answers:
创建会话时,将创建/发送JSESSIONID cookie。会话是在您的代码调用request.getSession()
或request.getSession(true)
首次调用时创建的。如果您只想获取会话,但如果不存在则不创建会话,请使用request.getSession(false)
-这将为您返回一个会话或null
。在这种情况下,不会创建新的会话,并且不会发送JSESSIONID cookie。(这也意味着会话不一定是在第一次请求时创建的 …… 创建会话时,您和您的代码将受到控制)
会话是基于上下文的:
SRV.7.3会议范围
HttpSession对象的作用域必须在应用程序(或Servlet上下文)级别。底层机制(例如用于建立会话的cookie)对于不同的上下文可以是相同的,但是容器绝不能在上下文之间共享引用的对象(包括该对象中的属性)。
更新:如果没有会话,则每次对JSP页面的调用都会隐式创建一个新会话。可以使用session='false'
page指令将其关闭,在这种情况下,会话变量在JSP页面上根本不可用。
request.getSession()
或request.getSession(true)
,那么您将获得现有会话或新会话。但是,如果您的代码调用request.getSession(false)
,那么您将获得现有会话,或者如果不存在会话,则为null。
以下是有关JSESSIONID
Cookie的另一个来源的一些信息:
我只是调试一些在tomcat服务器上运行的Java代码。我没有request.getSession()
在代码中的任何地方显式调用,但是我注意到JSESSIONID
仍在设置cookie。
我终于看了生成的与Tomcat下工作目录中的JSP对应的Java代码。
看来,无论您是否喜欢,如果您从Servlet调用JSP,JSESSIONID
都会被创建!
补充:通过添加以下JSP指令,我发现了这一点:
<%@ page session="false" %>
您可以JSESSIONID
通过JSP 禁用设置。
更正:请投票给PeterŠtibraný答案-这更加正确和完整!
“ JSESSIONID”是http会话的唯一ID,请参见此处的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>
为了在其中启用scriptlet。
对于在JSP中使用自定义标签生成的链接,我不得不使用
<%@ page session="false" %>
在JSP中
和
request.getSession().invalidate();
在Struts动作中