【问题标题】:@SessionScoped / @Stateful - how do they managed session/state@SessionScoped / @Stateful - 他们如何管理会话/状态
【发布时间】:2015-07-21 04:00:36
【问题描述】:

我对 Java EE 还很陌生。我在浏览 CDI 和 EJB 材料时遇到了 @SessionScoped 和 @Stateful 注释。

看定义: @SessionScope:维护用户跨多个 HTTP 请求与 Web 应用程序的交互。

@Statfeful : 看起来和@SessionScope 有相同的功能

所以这是我的疑问:

1) 它们两者的目的相同吗? 2) 我对 Node 和 Python 有一点经验。在那些用于维护客户端状态的语言中,我总是使用与 HTTPSession 对象相关联的 cookie,该对象进一步与内存缓存(redis/memcache)相关联,以便在所有服务器上分发。

所以我也可以在这里使用相同的技术...对吗?那我为什么要使用这些符号呢?另外,如果我打算使用它们,那么如何使它们分布在所有服务器上? 我的意思是来自客户端的请求可以到达 server1,然后下一个请求可以到达 server2 ..在这种情况下,如果这个 SesssionScoped 对象没有分发,那么事情将如何正常工作?

这些注释的目的是什么?

【问题讨论】:

    标签: java cdi ejb-3.0 java-ee-6


    【解决方案1】:

    不,它们不一样,但可以一起使用。

    @SessionScoped 将对象绑定到 HTTP 会话。 @Stateful 会话 Bean 仅仅意味着它们的状态可以通过来自单个调用者的调用来维护。有状态会话 Bean 来自重型客户端应用程序,在这些应用程序中,Java SE 程序可能会在远程服务器上查找 EJB 以完成工作。这些类型的客户端/服务器应用程序可能使用有状态 EJB 在服务器上维护一定数量的会话状态,而不需要 HTTP(它们在应用程序服务器上使用 RMI-IIOP、CORBA 等协议)。

    如今,您可以继续使用有状态会话 Bean 和 HTTP 会话。

    【讨论】:

    • @sessionScope 将一个对象绑定到 HTTP 会话...你能解释一下吗?如果我的 sessionScoped 对象没有分发,那么这将如何工作?这个绑定是如何完成的?以前,我使用 cookie 将我的 http 请求绑定到 http 会话对象(在 node.js 中)
    • 我的意思是任何意图保持客户端状态的对象都必须分布在所有应用程序服务中,不是吗?
    • 不分发是什么意思?我认为您混淆了集群和 http 会话。
    • 我的意思是,假设我将用户的数据保存在 SessionScoped bean 中。我的应用程序部署在 2 台服务器上,中间有一个负载均衡器。现在客户端发出请求并命中 server1 ,这里我们实例化一个 SessionScoped bean 来保存他的会话数据。现在他提出另一个请求,它转到 server2 。在这种情况下,服务器 2 中没有状态,现在怎么办?在这种情况下,我们通常使用 http 会话对象,这些会话对象保存在内存中的键值存储中,如 cohorence/redis 等...
    • 您肯定会混淆集群和会话。集群是一种允许您在两个节点之间共享数据的选项。
    【解决方案2】:

    在和我的队友谈过之后,我想我的问题有一个可能的答案。

    在粘性会话的情况下,可以利用 sessionScope 或 stateful。 Sticky and NON-Sticky sessions

    在这种情况下,用户会话仅固定在一个盒子上,而不是分布在所有盒子上。但是如果我们不使用粘性会话,这些注释几乎没有用处

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2011-06-17
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多