簡體   English   中英

如何將java webstart與RMI混合使用?

[英]How to mix java webstart with RMI?

我想分發一個使用RMI的webstart應用程序。

我想避免向用戶詢問RMI服務器的地址,因為分發應用程序的網站也是RMI服務器。

此外,我不知道構建時服務器的地址,因此必須將地址添加到JNLP的臨時配置,或者必須在執行時提供地址。 這是首選方式:是否可以這樣做?

我沒有完全使用Java RMI(我只使用帶有Hessian二進制協議的Java Web Start來執行類似RMI的操作),但至少將服務器地址傳遞給Web Start客戶端應用程序應該很容易。 在應用程序中生成JNLP文件時,將地址添加為屬性:

<jnlp>
  [...]
  <resources>
    [...]
    <property name="serverAddress" value="..." />
  </resources>
</jnlp>

然后,在客戶端代碼中讀取該屬性:

String serverAddress = System.getProperty("serverAddress");

我在這里假設分發應用程序的網站知道自己的地址:)

編輯 (在構建時不知道地址的附加限制):嗯,網站分發應用程序是動態的還是靜態的?

  1. 動態:動態生成整個JNLP(使用JSP頁面或dom4j或其他),或者讀取“模板”JNLP XML文件並替換實際的服務器地址
  2. static:我想部署站點的人必須在JNLP文件中手動配置正確的地址嗎?

在我工作的地方,我們正是這樣做的,並根據Jonik的回答將RMI注冊表的主機名放在JNLP中。 在Java 6u10或u11中,Sun關閉了Webstart的幾個安全漏洞,包括動態JNLP的問題。 為了滿足所有安全警告,您必須將JNLP的相同副本放在程序的主jar中。 這是為了防止第三方在您的代碼中注入額外的jar或參數。 程序將在沒有它的情況下運行,但會向用戶顯示信任通知。

我們知道在構建時的地址,但有其他動態JNLP問題等等不得不求助於提供JNLP和每個可能的運行時設置了一個JAR。 這對我們來說更令人頭疼,而不是客戶的問題,但如果你簽署了你的發行版,那么值得了解。

JDK包含一個servlet的源代碼(在samples / jnlp / servlet目錄中),該servlet將適當的值插入JNLP文件中。 您可以使用它將主機名插入JNLP文件。

我在jnlp中使用變量占位符:

...
<application-desc>
    <argument>{host}</argument>
    <argument>{port}</argument>
</application-desc>
...

並且當JNLP被提供給客戶端時,使用Interceptor servlet在運行時替換它們。

暫無
暫無

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

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