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

Dav*_*idS 1 java architecture ejb java-ee cdi

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

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

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

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

我密切相关的问题:

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

ps我是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消息.我认为他们使用证书对客户端进行身份验证.应用程序X将XML转换为POJO并直接调用我的无状态EJB服务.

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

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

cil*_*lap 5

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

假设您正在讨论关注Backing beans: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分开:有状态会话Bean和HTTP会话

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

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

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

HttpServletRequest.getSession(true)
Run Code Online (Sandbox Code Playgroud)

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

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

更新1

是否可以将SessionScoped bean注入无状态EJB,因为知道远程客户端将调用Statelesss EJB?在这种情况下,SessionScoped bean的价值是多少?

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

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

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

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