Jakarta ee 如何拆分SFSB门面?

Jakarta ee 如何拆分SFSB门面?,jakarta-ee,ejb-3.0,stateless-session-bean,facade,stateful-session-bean,Jakarta Ee,Ejb 3.0,Stateless Session Bean,Facade,Stateful Session Bean,我在开发基于EJB3技术的应用程序时遇到了一些问题 我想在会话bean中使用Facade模式来将我的客户机(web应用程序)与实体bean分离 我正在使用SFSB管理用户会话 因此,我有一个FacadeLoginRemote远程接口,它向客户端公开方法doLogin(),doLogout(),等等。。。 目前,该SFSB还包括一些其他方法,如getCourse(intid),getResource(intid)。并不是所有的用户都能真正获得课程和资源,所以Facade在将值返回给客户端之前会执行

我在开发基于EJB3技术的应用程序时遇到了一些问题

我想在会话bean中使用Facade模式来将我的客户机(web应用程序)与实体bean分离

我正在使用SFSB管理用户会话

因此,我有一个
FacadeLoginRemote
远程接口,它向客户端公开方法
doLogin()
doLogout()
,等等。。。 目前,该SFSB还包括一些其他方法,如
getCourse(intid)
getResource(intid)
。并不是所有的用户都能真正获得课程和资源,所以Facade在将值返回给客户端之前会执行一些检查

我想拆分FacadeLoginRemote,将方法
getCourse()
getResource()
放在一个特殊的类中,但将检查用户权限的功能留给
FacadeLoginRemote

如果我制作了一些不同的SLSB,我将向客户端公开它们。因此,客户端可以直接连接到它们,避免来自
FacadeLoginRemote
的检查

我错了吗?有没有办法做到这一点

提前感谢,


安德里亚

第一句忠告;如果您正在构建一个web应用程序,那么在同一个应用程序中使用web层和业务层更为典型。在这种情况下,不需要远程处理。会话bean将在与web层相同的JVM中运行

这并不是说没有任何合法的理由使用远程接口(有很多),但在阅读您的问题描述时,我觉得您最好使用本地bean

或者您所说的web应用程序是由其他人在其服务器上托管的远程应用程序,他们是否使用来自您的EJB bean的服务

在JavaEE中,身份验证可以在web模块中完成。特别是当您使用本地bean时,这种身份验证(安全主体)将自动传播到ejbbean。您可以对EJB bean进行注释,以要求特定的安全角色。如果用户未经过身份验证,则她没有该角色,服务将被拒绝

在这种情况下,客户机是否尝试直接连接到具有
getCourse()
etc方法的bean并不重要


我确实想知道您是如何在EJB中实现
doLogin()
的。我的猜测是您在那里做了一些定制的事情,因为不幸的是,据我所知,EJB3没有一种简单的方法通过特定bean上的特定方法进行编程登录。安全性主要是声明性的,当访问任何bean时,客户端必须提供身份验证细节。例如,当您从远程JNDI请求bean时,您必须提供这些详细信息以及到远程服务器的初始JNDI连接。

是的,关于web和业务层,您是对的。它们在同一个JVM上工作。我使用远程接口只是因为我正在考虑开发一个可能的桌面或移动客户端应用程序。因此JVM将是不同的。正如您所猜测的,我实现了
doLogin()
来执行一些自定义身份验证操作,我的目标是将此身份验证传播到其他bean。我将检查有关安全性的EJB注释。谢谢你的回答,不客气。还要注意,为同一个bean提供远程和本地接口非常容易。在同一JVM中运行的代码使用本地接口,让外部代码使用远程接口。为了最大限度地减少冗余,两个接口都可以从基接口类继承,也可以相互继承。使用本地接口通常也更有效。