我们的应用程序包含与支持bean和无状态EJB服务交互的网页,但也有一个与无状态EJB服务交互的远程客户端。
许多服务查询数据库,然后根据当前用户/调用者过滤结果集(例如,用户只能查看某些记录类型);也就是说,他们使用程序化而非声明性安全性。
在网络方面,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户过滤结果集,以便过滤也适用在远程客户端调用期间我可以将SessionBean注入无状态EJB服务,但我认为SessionBeans使用HTTP会话,并且因为在远程客户端调用期间没有HTTP会话,所以我看不出它是如何工作的。
我觉得我的方法是错误的,我应该从容器中检索“Principal”;但是,由于我们的应用程序的开发生命周期,容器管理的安全性尚未设置,但我仍然负责实现负责过滤记录的业务逻辑,而不是以后。
我密切相关的问题:
P.S。我是Java EE的新手。
技术:
javax.enterprise.context.SessionScoped
javax.ejb.Stateless
更新
有关“远程客户端”的更多详细信息。我不确定如何说这个,因为我是Java EE的新手,但这个“远程客户端”不会通过HTTP。另一个应用程序,我们称之为应用程序X,将从客户端接收XML消息。我认为他们使用证书对客户端进行身份验证。 Application X将把XML转换为POJO并直接调用我的无状态EJB服务。
在这种情况下,我认为我说我不应该将SessionBean
注入Stateless
EJB服务,因为当Application调用EJB服务时不会有HTTP会话X.我的理解是否正确?
感谢您的耐心等待。我知道我对这些事情的无知。
答案 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