【问题标题】:How can one isolate logical layers of an Java EE application如何隔离 Java EE 应用程序的逻辑层
【发布时间】:2012-12-19 22:26:20
【问题描述】:

我不确定这实际上是一个真正的问题还是一个愚蠢的初学者问题。可能我漏掉了一点,这个问题比较琐碎,请多多包涵。

如果我没记错的话,那么层和层之间的区别在于层与逻辑分离有关,而层则意味着应用程序各部分的物理分离。

可以将层实现为单独的层,以保护应用程序免受用户直接调用,例如到数据访问对象。但我的意图是以逻辑方式向用户客户端隐藏应用程序的较低层,这意味着实际上不使用单独的 jvm 或应用程序服务器。我该怎么做,这是否与包装的方式有关? (不同的档案,如 jar、war、ears 以隔离逻辑......)。

我实际上对为分层服务器应用程序提供安全性很感兴趣,因为它可能存在各种不受我控制的客户端。如果我为客户端应用程序程序员提供高级服务的接口,我也必须使用 EJB 安全注释来保护低层。我希望通过将较低层标记为应用程序客户端无法访问来以更优雅的方式执行此操作。

【问题讨论】:

    标签: security ejb layer


    【解决方案1】:

    但我的意图是以逻辑方式向用户客户端隐藏应用程序的较低层,这意味着实际上不使用单独的 jvm 或应用程序服务器。

    如果这些“用户客户端”在同一个 JVM 甚至同一个应用程序(例如同一个 .war、同一个 .ear)中运行,那么您所寻求的安全级别只是表面的。基本上,您是在保护自己的同事或团队成员(通常,“用户客户端”是外部客户端,从不同的机器运行,通过 Internet 等方式与您联系)。

    在 Java EE EAR 应用程序中存在一些分层,但这些层的存在是为了防止业务逻辑直接访问视图逻辑。例如。较低级别的层无法访问较高级别的层。这些层通过类加载器隔离相互保护。具体来说,每个 Web 模块都位于层次结构的底部,其他模块(甚至不是其他 Web 模块)无法直接访问其中的代码。 EJB 模块是向下的一层,所有 Web 模块以及其他 EJB 模块都可以访问其中的代码。最后是顶层 EAR,它不算作模块,但可以包含实用程序代码,这些实用程序代码不应直接访问模块中的代码,但可以被所有模块使用(因此是跨层的,Web 模块也可以直接访问)。

    Java EE 中的模块系统似乎与您想要的不同。它隐藏了更高的层,而不是更低的层。

    通过将多个“协作”应用程序部署到同一个应用程序服务器,可以实现额外级别的模块隔离。然后,您可以将 EJB bean 的远程接口定义为您试图隐藏的逻辑的网关(外观)。请注意,尽管许多应用程序服务器也允许部署到同一 AS 的其他应用程序从 JNDI 请求本地 EJB,尽管 EJB 规范不要求这样做(但也没有禁止)。

    此外,还有私有和受保护访问修饰符的常用机制,但这些更适合保护您免受编码错误的影响。反射技巧很容易通过它们。

    还有安全管理员。如果您不信任来自您自己的队友(“用户客户端”)的代码,您可能需要考虑使用这些代码。它们可能难以使用,但可能正是您想要的。

    【讨论】:

    • 非常感谢您的详细回答,其中还涵盖了一些我不知道的重要方面。
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2023-03-16
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多