【问题标题】:How to split SFSB Facade?如何拆分 SFSB Facade?
【发布时间】:2011-06-06 02:34:49
【问题描述】:

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

我想在会话 bean 中使用外观模式将我的客户端(Web 应用程序)与我的实体 Bean 分离。

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

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

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

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

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

提前致谢,

安德烈亚

【问题讨论】:

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


    【解决方案1】:

    第一个忠告;如果您正在构建一个 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 连接中提供这些详细信息。

    【讨论】:

    • 是的,您对网络和业务层的看法是正确的。它们在同一个 JVM 上工作。我使用远程接口只是因为我也在考虑开发可能的桌面或移动客户端应用程序。所以JVM会有所不同。如您所料,我实现了doLogin() 来执行一些自定义身份验证操作,我的目标是将这个身份验证传播到其他bean。我将检查有关安全性的 EJB 注释。谢谢你的回答。
    • 不客气。另请注意,为同一个 bean 提供远程和本地接口非常容易。对在同一个 JVM 中运行的代码使用本地接口,让外部代码使用远程接口。为了最大限度地减少冗余,两个接口都可以从基接口类或相互继承。使用本地接口通常也更加更有效率。
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2012-06-23
    • 2014-02-02
    • 2020-02-03
    • 2023-03-16
    • 2021-03-12
    相关资源
    最近更新 更多