2010-03-18 50 views
1

我想知道是否有方法讓Java類找出它是否在applet中使用?檢測Applet上下文(我是在一個applet中嗎?)

也就是說,我有一個庫(一個.jar文件),可以由第三方應用程序和小程序使用。它可以在小應用程序中工作,但是我希望做一些不同的處理,具體取決於庫是否用於applet中 - 比如show applet-可用的錯誤,避免本地文件I/O等。

如果,比如說,Applet.getAppletContext()是靜態的,這樣我就可以調用它(並且獲得NULL或者不爲NULL),即使我沒有applet實例也是很好的,但是,事實並非如此。有沒有其他方法?

回答

1

按照Java Security Overview Whitepaper(第14條第2款)

Java小應用程序和Java™Web Start的 應用程序會自動運行 安裝了安全管理器。 但是,通過java命令執行的本地應用程序 默認爲 未安裝SecurityManager 。

這應該意味着對System.getSecurityManager()的調用將在applet中返回非null值,並且當不在applet中時將返回null。例外是可能的,例如在運行程序時可以從命令行指定安全管理器。

boolean insideApplet() 
{ 
    return null != System.getSecurityManager(); 
} 
+1

有各種理由設置在非小應用程序安全管理......,這樣不會遺憾的是工作得很好。 – TofuBeer 2010-03-18 16:57:17

+0

不過,這是一個開始。也許我可以得到SeurityManager,如果它是null,那麼它絕對不是一個applet,如果它不爲null,我會用checkAccept(「example.com」,80)或類似的東西來舉例說明。 com是真正的example.com,所以applet不能從那裏來,並且將被禁止與該服務器進行通信。 – 7macaw 2010-03-18 17:09:33

+0

仍然不是一個可靠的方法來做到這一點。例如,當我標記學生作業時,我將他們的應用程序鎖定得很緊密,以免他們弄亂打標機。安裝自己的安全管理器有很多原因(我的另一個例子是確保應用程序無法調用System.exit)。 – TofuBeer 2010-03-18 20:16:41

1

可能是最安全的方法是讓用戶告訴你,如果它是一個小程序(只需添加一個「布爾」變量適當的構造函數(S)和/或方法(S)。

當然,你想要一些更自動的東西來避免這種情況,但據我所知,並不知道如何運行跨越虛擬機的程序,我可能會先看看安全管理器torak在他/她的回答中提出了建議,但是不僅僅是查找null,我會檢查它是什麼類型。我環顧了一下,但沒有發現安全管理器類是否有任何「標準」名稱, applets use。

最終,最安全的方法是讓圖書館的用戶來決定,因爲他們將獲得所需的信息。

+0

在某些時候可能需要對applet強制執行一些限制,所以我需要自動執行一些操作......實際上,我可能會要求將Applet實例(或null)傳遞給我,並驗證它(如參見如果有Applet.getAppletContext()返回的有效上下文)。謝謝你的想法! – 7macaw 2010-03-18 17:29:47

2

檢測它是否作爲applet運行的替代方法是在發生安全異常時使用回退方法。當在另一個環境中使用時,這將是有利的,例如具有安全上下文的servlet容器。

例子:

try { 
    File file = new File("c:\\test.txt"); 
    System.out.println("Exists? " + file.exists()); 
} catch (java.security.AccessControlException e) { 
    // fallback 
} 
+0

你想要真的抓到'SecurityException'。也可以直接調用安全管理器來檢查給定的上下文是否具有特定的權限。 – 2010-03-18 20:55:15