如何拆分SFSB Facade?

时间:2011-01-09 15:00:37

标签: java-ee ejb-3.0 stateless-session-bean facade stateful-session-bean

我在使用基于EJB 3技术的应用程序时遇到了一些问题。

我想在会话bean中使用Facade Pattern来将我的客户端(Web应用程序)与我的Entity Bean分离。

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

所以我有一个FacadeLoginRemote远程接口,向客户端公开方法doLogin()doLogout()等等...... 目前,此SFSB还包括一些其他方法,例如getCourse(int id)getResource(int id)。并非所有用户都可以获取课程获取资源,因此Facade会在将值返回给客户端之前执行一些检查。

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

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

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

提前致谢,

安德烈

1 个答案:

答案 0 :(得分:2)

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

这并不是说没有任何合理的理由可以使用远程接口(有很多),但是阅读你的问题描述在我看来你可能最好使用本地bean。

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

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

在这种情况下,如果客户端尝试直接连接到具有getCourse()等方法的bean,则无关紧要。

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