簡體   English   中英

將Java程序之間的通信限制為同一用戶

[英]Restrict communication between Java programs to same user

我們想構建一個與文件和URL關聯的Java應用程序,但是一次只能運行一個實例。 如果打開了第二個文件,則應由一個正在運行的實例處理(如果有)。 (將其視為文件查看器:用戶單擊瀏覽器中的鏈接將打開該應用程序,單擊第二個鏈接會將同一應用程序置於最前面,並在新視圖中打開第二個URL。)

為此,我的計划是:

  • 用戶調用app file1.ext 這將啟動第一個實例。
  • 該實例檢測到它是唯一正在運行的實例,繼續啟動並打開file1.ext
  • 用戶調用app file2.ext 這將啟動第二個實例。
  • 第二個實例檢測到它是第二個實例,並發送命令打開file2.ext到第一個實例。
  • 第一個實例從第二個實例接收該命令,打開file2.ext並進行確認。
  • 二審中止啟動並退出。

我可以想到各種用於實現通信通道的技術,但是所有這些技術都會在本地計算機上打開端口。 很好,但是我想確保只有當前用戶才能使用此端口。 我可能可以防止第二個用戶意外地將命令發送到第一個用戶的應用程序,但是如何強制端口或用於進程間通信的任何內容僅對啟動第一個應用程序的用戶可用?

解決方案應盡可能獨立於平台。

您可以使用鎖/ PID文件,程序應檢查鎖文件是否存在以查找是否存在現有進程。 鎖定文件應包含正在偵聽的端口號,服務器密鑰和會話密鑰。 您需要設置文件許可權,以便當前用戶只能讀取它 發送給初始進程的所有消息都必須包含匹配的會話密鑰。 會話密鑰證明了原始進程具有讀取鎖定文件的權限,因此您的打開端口會繼承鎖定文件的權限。

為了安全起見,您需要注意打開端口並寫入鎖定文件的順序。 在編寫鎖定文件之前 ,您需要確保已打開端口 ,否則惡意程序可能會超出服務器的接收范圍,並接收其不應該讀取的消息。 另外,第二個過程應該檢查鎖文件的所有者 ,以確保它是由當前用戶創建的。 另外,在第二個進程開始發送數據之前,您還應該檢查服務器握手時是否返回了服務器密鑰 ,以確保當前正在運行的服務器實際上也對鎖定文件具有讀訪問權限,因為服務器可能很長。死機,由惡意程序代替。 最后,除非您實際上希望允許來自網絡的請求,否則請確保該程序僅綁定到本地連接

如果這是僅適用於Linux / Unix / Mac的程序,那么您還有另一種選擇來打開Unix域套接字。 您應該設置域套接字的文件許可權,以便當前用戶只能對其進行讀寫。 如果您使用域套接字,則不需要會話密鑰或所有這些握手操作,因為域套接字的權限由域套接字的文件權限強制執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM