gpt4 book ai didi

java - 限制同一用户的 Java 程序之间的通信

转载 作者:行者123 更新时间:2023-12-02 04:50:56 24 4
gpt4 key购买 nike

我们想要构建一个与文件和 URL 关联的 Java 应用程序,但一次只能运行一个实例。如果打开第二个文件,则应由已在运行的实例(如果可用)处理该文件。 (将此视为文件查看器:用户单击浏览器中的链接将打开应用程序,单击第二个链接会将同一应用程序带到前面,并在新 View 中打开第二个 URL。)

为此,我的计划是:

  • 用户调用app file1.ext。这将启动第一个实例。
  • 此实例检测到它是唯一正在运行的实例,继续启动并打开 file1.ext
  • 用户调用app file2.ext。这将启动第二个实例。
  • 第二个实例检测到它是第二个实例,并向第一个实例发送打开 file2.ext 的命令。
  • 第一个实例从第二个实例接收该命令,打开 file2.ext 并确认。
  • 第二个实例中止启动并退出。

我可以想到多种技术来实现通信 channel ,但它们都在本地计算机上打开一个端口。没问题,但我想确保只有当前用户才能使用此端口。我可能可以防止第二个用户意外向第一个用户的应用程序发送命令,但如何强制端口或用于进程间通信的任何内容仅对启动第一个应用程序启动的用户可用? p>

解决方案应尽可能独立于平台。

最佳答案

您可以使用lock/pid文件,程序应该检查lock文件是否存在以查找是否存在现有进程。锁定文件应包含其正在监听的端口号、服务器 key 和 session key 。您需要设置文件权限,使其只能由当前用户读取。发送至初始进程的所有消息都必须包含匹配的 session key 。 session key 是原始进程有权读取锁定文件的证明,因此您打开的端口继承了锁定文件的权限。

为了安全起见,您需要注意打开端口和写入锁定文件的顺序。您需要确保在写入锁定文件之前打开端口,否则恶意程序可能会超越服务器并接收其不应读取的消息。此外,第二个进程应该检查锁定文件的所有者,以确保它是由当前用户创建的。此外,在第二个进程开始发送数据之前,您还应该检查服务器在握手中返回服务器 key ,以确保当前运行的服务器实际上也具有对锁定文件的读取访问权限,因为服务器可能早已死亡,被恶意程序取代。最后,确保程序仅绑定(bind)到本地连接,除非您确实希望允许来自网络的请求。

如果这是一个仅限 Linux/Unix/Mac 的程序,那么您还有另一种选择,即打开 Unix 域套接字。您应该设置域套接字的文件权限,以便仅当前用户可读/可写。如果您使用域套接字,则不需要 session key 或所有这些握手内容,因为域套接字的权限是由域套接字的文件权限强制执行的。

关于java - 限制同一用户的 Java 程序之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29255015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com