【问题标题】:Is Spring session scoped bean saved in HttpSession?Spring会话范围的bean是否保存在HttpSession中?
【发布时间】:2012-03-04 09:16:36
【问题描述】:

因为我对 Spring session 范围的实现没有深入的了解。 谁能告诉我使用 Spring Session 范围的 bean 是否明智,其中 HttpSession 对象非常重要。就像一个 Web 应用程序,成千上万的用户同时访问该网站。

Spring session 范围的 bean 是否保存在 HttpSession 对象中?

或者即使 HttpSession 对象只引用 Spring session 范围的 bean,我们不是让 session 对象变得沉重吗?

在 HttpSession 对象中直接存储任何 bean 的形式有何不同(使 HttpSession 对象重的观点)?

【问题讨论】:

    标签: java spring servlets inversion-of-control httpsession


    【解决方案1】:

    这是 Spring 文档所说的:

    将单个 bean 定义限定为 HTTP 会话的生命周期。 仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

    “重”?不比你放入的物体重。会话应该有一个有限的生命周期。每个会话几 KB 不会是您的应用程序的结束。对同时会话数和对象内存要求的简单计算应该会让您对应用服务器内存设置放心。如果需要,您可以随时增加最小和最大内存。

    无论您是否是 Spring bean,在 HTTP 会话中存储内容都是一样的。 bean 工厂只是做了一些额外的事情来帮助您管理对象生命周期。

    【讨论】:

      【解决方案2】:

      对象并没有真正存储在 HTTP 会话中。它与会话 id 链接并实际存储在 Spring 上下文中。会话侦听器用于在会话关闭后清理实例。请参阅SessionScopeJavaDoc。

      【讨论】:

      • 我不确定你是否错了,(而且我现在很累跳到 Spring 源代码),但是集群中的会话复制呢?我很难相信这就是 Spring 的运作方式!
      • 看Spring源码,这个好像不太准确。会话范围的 bean 实际上存储在 HttpSession 对象本身内。 SessionScope 最终会调用 ServletRequestAttributes.setAttribute()
      【解决方案3】:

      Spring session 范围的 bean 是否保存在 HttpSession 对象中?

      如果你在这里提到的 HttpSession 对象实际上是由 spring-session 提供的(spring-session 将 httpSession 对象包装在原始 httpRequest 中),答案将是 YES -> 确实,所有 spring session 范围的 bean 都保存在 httpSession 中由 spring-session 作为属性提供。

      或者即使 HttpSession 对象只引用 Spring session 范围的 bean,我们不是让 session 对象变得沉重吗?

      没有。 httpSession 的“重量”很大程度上取决于您放入的对象。此外,会话 bean 是短暂的。最后但同样重要的是,微服务世界中的会话对象通常被卸载到独立存储,如 Redis 或 HazelCast。因此,就内存消耗而言,它不会被视为“重”。

      将任何 bean 直接存储在 HttpSession 对象中有何不同(使 HttpSession 对象重的观点)?

      完全没有区别(假设您使用的是spring-session),因为所有spring session作用域的bean都保存在spring-session提供的httpSession中作为属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-16
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 2018-06-03
        相关资源
        最近更新 更多