Java request.getSession().getId()与request.getRequestedSessionId()的比较

Java request.getSession().getId()与request.getRequestedSessionId()的比较,java,servlets,jakarta-ee,httpsession,Java,Servlets,Jakarta Ee,Httpsession,request.getSession().getId()和request.getRequestedSessionId()之间有什么区别?它们是否都返回相同的内容,即会话Id 感谢您的请求。getRequestedSessionId()将返回客户端指定的会话id(可能在cookie中)request.getSession().getId()将返回服务器的会话id(如果会话不存在,request.getSession()将创建它) 重要的区别在于,您不能依赖由request.getRequested

request.getSession().getId()
request.getRequestedSessionId()
之间有什么区别?它们是否都返回相同的内容,即会话Id


感谢您的请求。getRequestedSessionId()将返回客户端指定的会话id(可能在cookie中)
request.getSession().getId()
将返回服务器的会话id(如果会话不存在,
request.getSession()
将创建它)

重要的区别在于,您不能依赖由
request.getRequestedSessionId()
返回的值,因为它可能无效。从文件中:

返回客户端指定的会话ID。这可能与此请求的当前有效会话的ID不同。如果客户端未指定会话ID,则此方法返回null


HttpRequest.getRequestedSessionId()
是调用方提供的会话id,通常使用JESSIONID cookie,而
HttpRequest.getgesion().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)
的源代码,您可以让自己相信上述内容。

通过检查它们是否匹配可以实现什么吗?很难说tbh。如果您收集了这些值的正常行为指标,您可能会检测到该行为中的异常,这可能是对您的应用程序的攻击。但是这是一个很大的假设。为什么客户端的会话ID可能与此请求的当前有效会话的ID不同?(假设会话在客户端仍然有效)我认为在大多数情况下,值是相同的,但我永远不会假设它。