有没有办法通过 Servlet 或类似的东西将 Java 桌面应用程序与 MySQL 连接起来?

Is there a way to connect a Java desktop app with MySQL through Servlets or something similar?

一段时间以来,我一直在开发一个 Java 桌面应用程序,基本上它所做的是在线对 MySQL 数据库的 CRUD 数据进行处理。我现在的问题是安全性,我不想在客户端应用程序上硬核任何用户信息。我正在考虑两种方法:

  1. 对客户端应用程序中的大部分MySQL语句进行硬编码,并使用服务器应用程序将用户和密码信息传输到客户端,因此客户端可以直接连接到数据库。我不喜欢这个想法,因为我不希望用户有任何获取数据库凭据的方法。

  2. 使用 3 层架构。我的客户端应用程序几乎完全编码,我在 MySQL 上有服务器 运行ning,现在我需要一个中间层来处理所有逻辑操作、凭据和所有内容,以便与客户端通信应用程序,示例:如果客户端应用程序请求清单列表,则服务器会检查它的凭据并向客户端应用程序发送包含所有清单的文件。

我的问题是:

你对你的第一选择持怀疑态度是对的。一方面,MySQL 和其他数据库服务器在防火墙远离 public 互联网时更加安全。

您需要一个可以将数据传送到客户端层的服务器层。

重要安全提示 不要构建服务器层来接受来自客户端层的原始 SQL 查询。 cybercreep 可能会使用它来发出 SELECT * FROM user 之类的查询并破坏您的数据。或 DROP TABLE user 破坏您的系统。

制定一个 API,您的客户可以通过它从您的服务器请求 CRUD 服务。您可能需要考虑 REST 风格 API,客户可以在其中说

获取https://example.com/user/id

或用

之类的东西更新数据

POST https://example.com/user/id

tel=5551212&email=mickey@disney.com

诀窍是弄清楚你想在 REpresentational State 中使用哪种 objects T转发。然后你可以使用 http PUT 创建它们,POST 替换或更新它们,使用 DELETE 删除它们。

REST-style APIs 在您的客户端中实现起来非常简单;他们使用普通的HttpClient operations。它们很容易通过 https 获得保护。

他们通常使用一个秘密令牌授权,一个 API 密钥,在每个请求的 http header object 中携带。您可以阅读相关内容。

因此,您的服务器代码必须实现您的 API。如果您选择使用 Java 语言来实现它,servlet 是必经之路:它们是开发和部署 Java 网络服务器代码的方式。您可以将它们部署在 Tomcat or Jetty 服务器环境中。

关于如何执行此操作的大量资源可用。例如,https://www.journaldev.com/9170/restful-web-services-tutorial-java

或者,通过网络浏览器的远程用户界面

第三选择:Web 应用程序 运行 使用自动生成 HTML/CSS/JavaScript 在 Web 浏览器中远程使用用户界面 运行 在服务器端的所有业务逻辑。用户将是 运行 网络浏览器而不是您的网络浏览器。

在这种情况下,客户端永远不会直接接触您的数据库,也不会运行任何敏感代码。我认为这是旧 X Window System(服务器上的应用程序,UI 远程呈现)的现代转世。

有两个这样的平台:

  • Vaadin running pure Java on the server. Built on top of well-worn Java Servlet技术。
  • Xojo Web Edition(以前称为 RealBasic)运行 服务器上专有的编译型面向对象编程语言。

在这两种产品中,Web 浏览器都用于显示用户界面小部件,例如标签、字段、按钮、弹出菜单、列表和数据网格。当用户使用这些小部件中的任何一个时,都会在服务器端引发一个事件。然后您的业务逻辑在服务器端执行。 您的业务逻辑和数据库连接仅存在于服务器上。 客户端仅获取要在屏幕上以表单形式显示的数据。

这两个平台都会自动生成所有 HTML、CSS、JavaScript、DOM、AJAX、WebSocket 和 Push 代码.所以你不需要掌握那些网络技术。这两个平台都可以与任何现代网络浏览器一起使用,因为它们仅使用标准网络技术。不涉及插件或小程序。

您将需要重写您的应用程序。但这可能并不像听起来那么令人生畏。桌面应用程序中的大部分工作都在设计、制定用户体验细节和确定业务规则方面。这将全部转移到您的 Vaadin 或 Xojo 工作中。如果使用 Vaadin,您所有的非 GUI Java 代码都可以直接转移。

如果您的原生本地应用程序具有无法在网络应用程序的限制范围内重新创建的特殊功能,那么这种方法不适合。但是你说你的应用程序的主要目的是数据库 CRUD。这种业务风格的面向表单的应用程序是 VaadinXojo Web Edition 的主要目的。

运行 网络应用离线

Vaadin 早期支持 Progressive Web Apps (PWA) 以启用 Web 应用程序 运行 离线。目前处于前沿,但正在改进,浏览器已经构建了对必要基础设施的支持。如果 PWA 可以很好地工作,某些类型的桌面应用程序可以用 PWA 网络应用程序代替。

参见Vaadin Progressive Web App Handbook

代理方式

关于您的特定用例,我建议您使用另一种解决方法。 您提到您已经拥有一个可能包含大量代码的桌面应用程序。目前它直接请求数据库。因此,从我的角度来看,将您的数据访问逻辑迁移到另一种技术——3tier 上是相当困难的。而且它几乎不依赖于确切的选择。

如果我没看错,你的主要问题是数据库的安全性。要在不完全重写您的应用程序的情况下解决这个问题,您可以为数据库引入某种代理作为中间层。该代理将驻留在服务器端并存储数据库的凭据。所以他们将无法为客户提供。客户端连接到代理并以与以前完全相同的方式运行,除了凭据(您当然可以要求代理凭据)。为了保护原始数据,您可以在代理端对数据访问引入一些限制。

我不确定这是一项简单的任务。它更多的是关于 network/system 编程。但如果您当前的应用程序足够大且足够成熟,我预计要做的工作量会少得多。 您可以尝试查找一些现有工具,例如 jdbc-proxy 作为起点。