【问题标题】:request.getSession().getId() vs request.getRequestedSessionId()request.getSession().getId() 与 request.getRequestedSessionId()
【发布时间】:2016-12-12 07:57:24
【问题描述】:

request.getSession().getId()request.getRequestedSessionId() 有什么区别?它们是否都返回相同的东西,即 Session Id?

谢谢

【问题讨论】:

    标签: java servlets jakarta-ee httpsession


    【解决方案1】:

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

    重要的区别是您不能依赖request.getRequestedSessionId() 返回的值,因为它可能无效。来自文档:

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

    【讨论】:

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

    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) 的源代码来说服自己。

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 2011-09-07
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2011-08-15
      • 2017-06-22
      相关资源
      最近更新 更多