request.getSession().getId() 与 request.getRequestedSessionId()

request.getSession().getId() vs request.getRequestedSessionId()

request.getSession().getId()request.getRequestedSessionId()有什么区别?他们两个 return 做同样的事情,即 Session Id?

谢谢

request.getRequestedSessionId() 将 return 客户端指定的会话 ID(大概在 cookie 中)。 request.getSession().getId() 将 return 服务器的会话 ID(如果会话不存在,request.getSession() 将创建它)。

重要的区别在于您不能依赖 request.getRequestedSessionId() 编辑的 return 值,因为它可能无效。来自文档:

Returns the session ID specified by the client. This may not be the same as the ID of the current valid session for this request. If the client did not specify a session ID, this method returns 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 class.

doGetSession(boolean) 的源代码让自己相信以上内容