request.getSession().getId()
和 request.getRequestedSessionId()
有什么区别?它们都返回相同的东西,即会话 ID 吗?
谢谢
request.getRequestedSessionId()
将返回客户端指定的会话 ID(大概在 cookie 中)。 request.getSession().getId()
将返回服务器的会话ID(如果会话不存在,request.getSession()
将创建它)。
重要的区别是您不能依赖
request.getRequestedSessionId()
返回的值,因为它可能无效。来自文档:
返回客户端指定的会话ID。这可能与该请求的当前有效会话的 ID 不同。如果客户端未指定会话 ID,则此方法返回 null。
HttpRequest.getRequestedSessionId()
是调用者提供的会话ID,通常带有JESSIONID cookie,而HttpRequest.getSession().getId()
是服务器有效使用的ID。
对于正在进行的会话,JESSIONID cookie 或
HttpRequest.getRequestedSessionId()
的值允许服务器通过 id 查找正在进行的会话。
对于新会话,您可能很想通过 JESSIONID cookie 提供一个值来设置服务器会话 ID,即
HttpRequest.getRequestedSessionId()
的值。这使得将由客户浏览器的初始调用发起的对多个服务器的调用链关联起来变得容易。但是,HttpRequest.getRequestedSessionId() 的语义不允许这种链接。
事实上,JESSIONID cookie 仅对服务器中已存在且先前发送到客户端的会话有效。如果 JESSIONID cookie 引用不存在的会话 ID,服务器将创建一个新会话忽略 JESSIONID cookie 的值。
通过阅读
doGetSession(boolean)
类中 org.apache.catalina.connector.Request
的源代码,您可以确信上述内容。