2

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

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

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

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

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

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

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

提前致谢,

安德烈亚

4

1 回答 1

2

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

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

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

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

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

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

于 2011-01-09T16:09:26.967 回答