2008-10-19 91 views
12

因爲在我的recent question中已經明確說明,Swing應用程序在使用Sun Webstart啓動程序運行時需要顯式調用System.exit()(至少的Java SE 6)。什麼是檢測Webstart是否啓動應用程序的最佳方法

我想盡可能地限制這種黑客攻擊,我正在尋找一種可靠的方式來檢測應用程序是否在Webstart下運行。現在我正在檢查系統屬性「webstart.version」的值是否爲空,但在文檔中找不到任何保證,該屬性應由未來版本/替代實現設置。

是否有更好的方式(最好是那些不ceate上的Webstart的API的依賴?)

回答

9

當您的代碼通過javaws啓動時,會加載javaws.jar,並且您不想依賴的JNLP API類可用。相反,測試對於不能保證存在的系統屬性,你可以改爲查看是否JNLP API類存在:

private boolean isRunningJavaWebStart() { 
    boolean hasJNLP = false; 
    try { 
     Class.forName("javax.jnlp.ServiceManager"); 
     hasJNLP = true; 
    } catch (ClassNotFoundException ex) { 
     hasJNLP = false; 
    } 
    return hasJNLP; 
} 

這也避免了需要在編譯時,包括你的類路徑上javaws.jar。

另外,你可以切換到javaws編譯。罐子和追趕的NoClassDefFoundError代替:

private boolean isRunningJavaWebStart() { 
    try { 
     ServiceManager.getServiceNames(); 
     return ds != null; 
    } catch (NoClassDefFoundError e) { 
     return false; 
    } 
} 

使用ServiceManager.lookup(字符串)和UnavailableServiceException是麻煩,因爲兩者是JNLP API的一部分。 ServiceManager.getServiceNames()沒有被記錄爲拋出。我們特別調用這段代碼來檢查NoClassDefFoundError。

5

使用javax.jnlp.ServiceManager檢索Webstart的服務。 如果可用,則在Webstart下運行。

http://download.java.net/jdk7/docs/jre/api/javaws/jnlp/index.html

+0

感謝您的建議。我已經想到了這一點,但它變成了WS不是標準的JRE類路徑的一部分,因爲我不想發佈API jar我不喜歡使用它(並且不,反射不是我正在尋找的答案。 ) – ddimitrov 2008-10-19 12:11:39

+0

或者你正在使用新的6u10插件... – 2008-10-19 18:25:19

+2

@ddimitrov,你爲什麼要避免反思?如果你爲`ServiceManager`得到一個`ClassNotFoundException`,你就知道你沒有在JWS下運行。 – finnw 2010-07-20 03:21:53

4

至於你提到的檢查系統屬性,如下所示可能是最徹底的方法:

private boolean isRunningJavaWebStart() { 
    return System.getProperty("javawebstart.version", null) != null; 
} 

在生產系統中我已經使用上述技術多年。

您還可以嘗試檢查是否有任何以「jnlpx」開頭的屬性。但是據我所知,這些都沒有「保證」在那裏。

另一種可能是嘗試初始化下載服務我們由湯姆提議:

private boolean isRunningJavaWebStart() { 
    try { 
     DownloadService ds = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService"); 
     return ds != null; 
    } catch (UnavailableServiceException e) { 
     return false; 
    } 
} 

當然確實有你的代碼連接到該API的下跌空間。

+0

ServiceManager仍然在javaws.jar中;你知道是否有任何官方文件說明設置的系統屬性? – ddimitrov 2008-10-19 14:23:19

3

除了在幾年前看過Java Web Start之外,我沒有真正的Java Web Start經驗。

如何使用您定義的參數啓動您的應用程序,而不是您通過Java web start啓動應用程序時設置的參數。

如果您想將參數傳遞給您的應用程序,則必須使用或元素將它們添加到啓動文件(又名JNLP描述符)中。

然後檢查是否設置了這些屬性。

再次,這是一個建議,我沒有編碼的JWS,它可能不是這麼容易。

0

您可以檢查當前類加載器是com.sun.jnlp.JNLPClassLoader(Java插件1)還是sun.plugin2.applet.JNLP2ClassLoader(Java插件2)的實例。儘管有「applet」包,但是使用帶有Java插件2的JNLP的applet使用了另一個類加載器sun.plugin2.applet.Applet2ClassLoader。它也適用於OpenJDK。

相關問題