【发布时间】:2016-12-12 07:57:24
【问题描述】:
request.getSession().getId() 和 request.getRequestedSessionId() 有什么区别?它们是否都返回相同的东西,即 Session Id?
谢谢
【问题讨论】:
标签: java servlets jakarta-ee httpsession
request.getSession().getId() 和 request.getRequestedSessionId() 有什么区别?它们是否都返回相同的东西,即 Session Id?
谢谢
【问题讨论】:
标签: java servlets jakarta-ee httpsession
request.getRequestedSessionId() 将返回客户端指定的会话 id(大概在 cookie 中)。 request.getSession().getId() 将返回服务器的会话 ID(如果会话不存在,request.getSession() 将创建它)。
重要的区别是您不能依赖request.getRequestedSessionId() 返回的值,因为它可能无效。来自文档:
返回客户端指定的会话 ID。这可能与此请求的当前有效会话的 ID 不同。如果客户端未指定会话 ID,则此方法返回 null。
【讨论】:
HttpRequest.getRequestedSessionId() 是调用者提供的会话 id,通常带有 JESSIONID cookie,而 HttpRequest.getGession().getId() 是服务器有效使用的 id。
对于正在进行的会话,JESSIONID cookie 或 HttpRequest.getRequestedSessionId() 的值允许服务器通过 id 找到正在进行的会话。
对于新会话,您可能很想通过 JESSIONID cookie 提供一个值来设置服务器会话 ID,即 HttpRequest.getRequestedSessionId() 的值。这将使将来自客户浏览器的初始调用启动的与多个服务器的调用链相关联变得容易。但是,HttpRequest.getRequestedSessionId() 的语义不允许这种链接。
实际上,JESSIONID cookie 仅对服务器中已经存在且之前发送到客户端的会话有效。如果 JESSIONID cookie 引用了一个不存在的会话 id,服务器将创建一个新会话忽略 JESSIONID cookie 的值。
您可以通过阅读org.apache.catalina.connector.Request 类中的doGetSession(boolean) 的源代码来说服自己。
【讨论】: