【问题标题】:JAVA Swing client, Data Access to Remote Database; IbatisJAVA Swing客户端,远程数据库数据访问;伊巴蒂斯
【发布时间】:2010-09-15 22:58:26
【问题描述】:

我有一个需要访问远程数据库的 Java 客户端。目标是向用户隐藏数据库凭据,而不是在代码中硬编码任何凭据。因此,数据库访问可能必须在服务器端。

我仅限于使用 Ibatis 作为数据抽象框架。除此之外,我还在网络服务器上运行 JBoss,允许我使用数据源。

您将如何设计远程数据库访问和数据序列化/反序列化。您是否更喜欢某种数据流的 Web 服务而不是套接字?您将如何实现两者中的任何一个?

【问题讨论】:

    标签: java jboss data-access-layer ibatis data-access


    【解决方案1】:

    构建一个服务层并通过 RMI 公开它 - 可能像您拥有 JBoss 一样作为 EJB3 无状态会话 bean,也可能作为纯 RMI。除非您有特殊需要,否则我不会使用 Web 服务。 RMI 将为您处理序列化的情况。

    您的服务层需要公开一种方法,以使用在 Swing 应用程序启动时输入的凭据对用户进行身份验证。所有对数据的调用都经过服务层。 Swing 应用程序中不存在 SQL。

    除了隐藏数据库凭据之外,这种安排还有其他好处。您不仅最终获得了分层架构,而且通过在服务器上拥有一个数据源,您可以通过在所有客户端之间共享准备好的语句来提高效率。

    【讨论】:

      【解决方案2】:

      所以您希望用户能够在不知道凭据的情况下访问数据库?您唯一的选择是服务器端数据库访问。不幸的是,在 Java 中无法隐藏用户名和密码——如果您将其放入属性文件并对其进行加密,确定的攻击者仍然可以附加调试器并查看您的代码中保存了哪些值。

      此外,除非您通过安全连接连接到数据库,否则其他人可能会运行数据包嗅探器(例如 tcpdump)并在那里获取凭据。

      您说您正在运行 JBoss 服务器,最好的办法是设置远程 EJB,这样您的客户端应用程序就不会直接访问数据库——它必须通过您的 EJB 方法。 (它不一定是 EJB,顺便说一下,如果你愿意,你可以做一些事情,比如 Web 服务)。

      关键是,您的服务器直接与数据库通信,而您的客户端唯一的访问权限是通过您在服务器上定义的一组有限的接口。

      【讨论】:

        【解决方案3】:

        如前所述,您必须连接到处理数据库连接的服务器。 30 分钟的努力是无法有效防止他人破坏您的安全的。

        如果客户端在本地连接,在 Intranet 中,在您的应用服务器上使用 EJB 可能是最好的选择...虽然您可能想要无状态会话 bean,但我不一定会打折消息驱动 bean。

        对于来自外部的更远距离的流量,我会使用基于 HTTPS 的网络服务

        在任何情况下,大多数应用服务器都有将其 EJB 公开为 Web 服务的机制,使用 WSDL;并且有大约一百个实用程序可以从 WSDL 生成客户端、调用 web 服务(axis 的 wsdl2java 工作得很好)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 1970-01-01
          • 2016-08-14
          • 2013-08-05
          • 2021-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多