如果我们将SessionScoped bean注入无状态bean,如果没有HTTP会话会发生什么?

时间:2015-01-28 19:26:14

标签: java java-ee architecture ejb cdi

我们的应用程序包含与支持bean和无状态EJB服务交互的网页,但也有一个与无状态EJB服务交互的远程客户端。

许多服务查询数据库,然后根据当前用户/调用者过滤结果集(例如,用户只能查看某些记录类型);也就是说,他们使用程序化而非声明性安全性。

在网络方面,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户过滤结果集,以便过滤也适用在远程客户端调用期间我可以将SessionBean注入无状态EJB服务,但我认为SessionBeans使用HTTP会话,并且因为在远程客户端调用期间没有HTTP会话,所以我看不出它是如何工作的。

我觉得我的方法是错误的,我应该从容器中检索“Principal”;但是,由于我们的应用程序的开发生命周期,容器管理的安全性尚未设置,但我仍然负责实现负责过滤记录的业务逻辑,而不是以后。

我密切相关的问题:

  1. 是否可以将SessionScoped bean注入无状态EJB,因为知道远程客户端将调用Statelesss EJB?在这种情况下,SessionScoped bean的价值是多少?
  2. 我的支持bean和无状态EJB服务是否应该从容器中检索Principal,而不是SessionScoped bean?
    • 如果是,在设置容器管理的安全性之前,如何替换模拟Principal来处理业务逻辑?
  3. P.S。我是Java EE的新手。

    技术:

    • Java EE 6
    • GlassFish 3.1.2.2
    • “支持豆”,例如javax.enterprise.context.SessionScoped
    • “无状态EJB服务”,例如javax.ejb.Stateless
    • “远程客户端”;即一些非Web客户端直接调用无状态bean(通过EJB / RMI)

    更新

    有关“远程客户端”的更多详细信息。我不确定如何说这个,因为我是Java EE的新手,但这个“远程客户端”不会通过HTTP。另一个应用程序,我们称之为应用程序X,将从客户端接收XML消息。我认为他们使用证书对客户端进行身份验证。 Application X将把XML转换为POJO并直接调用我的无状态EJB服务。

    在这种情况下,我认为我说我不应该将SessionBean注入Stateless EJB服务,因为当Application调用EJB服务时不会有HTTP会话X.我的理解是否正确?

    感谢您的耐心等待。我知道我对这些事情的无知。

1 个答案:

答案 0 :(得分:5)

您对问题并不十分清楚。你的问题让我承担了很多。因此,您应该打破问题并提供更多详细信息。 首先,您应该提到您正在使用的Java EE版本。无论如何,我的细节与您的背景有一些假设。

假设您正在谈论以下内容 支持bean:http://docs.oracle.com/javaee/5/tutorial/doc/bnaqm.html

“无状态bean”==无状态会话bean:http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html#gipin

SessionScoped bean:http://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

“远程客户互动”:http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html#girfl

对于主要问题,您应该记住将Http会话与有状态会话bean分开:Stateful Session Bean and HTTP Session

因此,如果您尝试将Http Session与有状态会话bean耦合,则必须将http会话详细信息提供到一个区域,在该区域中,http会话和有状态会话bean都可以访问数据,并且还可以保存对它的引用。

这也假设您的远程EJB服务不会首先创建http会话。因此,您将无法通过远程EJB对HTTP会话进行有效引用。

如果您使用基于HTTP的“远程客户端交互”,为什么不在第一次请求时创建http会话?

HttpServletRequest.getSession(true)

将确保您将始终获得有效会话

如果您正在使用其他一些HTTP基础框架,例如jax-rs,那么还可以选择在那里获取http会话。

更新1

  

可以将SessionScoped bean注入到无状态EJB中   Statelesss EJB将由远程客户端调用?是什么   在这种情况下,SessionScoped bean的值是什么?

您可以在EJB中将支持bean用作POJO,但不能用作http会话范围的bean。如果您需要远程EJB,则必须先使用它们进行初始化,然后才能使用它们。意味着,对远程EJB调用没有任何价值。

  

而不是SessionScoped bean,应该是我的支持bean和无状态   EJB服务是从容器中检索Principal吗?

此处的问题还不完全清楚。 您可以配置要使用的容器(glassfish)具有手动用户,角色和领域。因此,这是您对安全性的本地模拟,您可以从容器中检索Principal。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbxj.html#bnbxs

独立:我建议您阅读有关Java EE的Oracle教程。非常好。花一些钱,我会推荐Java EE 7 Essentials