在什么条件下创建了JSESSIONID?

时间:2009-02-27 18:00:12

标签: java jsessionid

创建JSESSIONID时的条件是什么?

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

5 个答案:

答案 0 :(得分:296)

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

会话是按上下文的:

  

SRV.7.3会话范围

     

HttpSession对象的作用域必须是   应用程序(或servlet上下文)   水平。潜在的机制,如此   作为用于建立的cookie   会话,可以是不同的   上下文,但引用的对象,   包括其中的属性   对象,绝不能在它们之间共享   容器的上下文。

Servlet 2.4 specification

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

答案 1 :(得分:44)

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

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

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

看来,不管你喜不喜欢,如果从servlet调用JSP,JSESSIONID都会被创建!

补充:我刚刚发现添加了以下JSP指令:

<%@ page session="false" %>

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

答案 2 :(得分:20)

更正:请投票支持PeterŠtibraný的回答 - 它更正确,更完整!

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

  

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

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

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

希望,这可以回答你的问题。

答案 3 :(得分:7)

请注意您的网页是否包含其他.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。

答案 4 :(得分:1)

对于使用自定义标记在JSP中生成的链接,我必须使用

<%@ page session="false" %>
JSP中的

request.getSession().invalidate();
Struts动作中的