2012-02-28 83 views
3

我正在使用幫助器小程序來管理大文件的傳輸。我們目前有一個小應用程序管理整個事務,從選擇包含文件的文件夾,傳輸它們,報告操作的成功和失敗,但在很多方面都不令人滿意。所以現在我們只需要applets的非常微妙的幫助,讓用戶在本地機器上找到一個文件夾並管理傳輸。我們希望儘可能多的反饋和用戶交互來使用基於Web的控件。因此,您可以想象這需要在瀏覽器中大量使用applet和Javascript之間的橋樑。JFileChooser在通過JS調用時導致AccessControlException,通過applet調用時工作

大多數情況下,這是相當簡單的,但我發現了一個奇怪的邊緣情況。我有一個方法彈出JFileChooser對話框,並查看該文件夾的內容並將其報告回來。當我在start()方法中創建一個JButton並使用它彈出JFileChooser時,我有這個工作。但是我將JFileChooser的所有代碼放入一個名爲showFolderSelect()的方法中,以便我也可以嘗試從Javascript中打開JFileChooser。因此,從applet中此調用的工作原理:

public void actionPerformed(ActionEvent event) { 
    if ("browse".equals(event.getActionCommand())) { 
     showFolderSelect(); 
    } 
} 

但是從Javascript此調用不:

function selectFolder() { 
    var infoApplet = document.getElementById('infoApplet'); 
    infoApplet.showFolderSelect(); 
} 

JavaScript調用讓我在Opera的控制檯以下消息:

[5 October, 2003 6:26:56 AM] JavaScript - http://localhost:8080/applet-webapp/ 
Event thread: click 
Uncaught exception: Error: java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read) 
Error thrown at line 20, column 12 in selectFolder() in http://localhost:8080/applet-webapp/: 
    infoApplet.showFolderSelect(); 
called from line 1, column 0 in <anonymous function>(event) in http://localhost:8080/applet-webapp/: 
    selectFolder(); 

任何想法,我怎麼能得到這個工作從Javascript?或者我只需要使用applet的start()方法中創建的JButton?

請注意,我不能指望用戶能夠使用java.policy配置或任何類似的東西。唯一可以預期的安全和訪問控制的點頭是applet(s)被數字簽名。

感謝您對此問題的任何幫助或見解。

+0

請參閱[此答案](http://stackoverflow.com/a/7842706/418556)重新。 'AccessController' /'doPrivileged的()'。 – 2012-02-29 05:14:02

回答

0

我認爲這說明了Java可以做什麼以及JavaScript不能做什麼。它看起來像JavaScript不允許調用允許訪問客戶端系統的方法。也許對Java代碼的JavaScript訪問僅限於未經簽名的applet允許的內容。

我無法想象任何解決方法,如果這只是Java-JavaScript橋樑中的限制。對我來說,它看起來就是這樣。

如果您對applet中的整體用戶體驗不滿意,請考慮將其移至JavaFX而不是使用JavaScript的純瀏覽器界面。

查看Java FX Ensemble gallery以獲取您可以使用的UI組件列表。

0

在大多數現代Web瀏覽器上,JS應用程序只能打開文件對話框以響應用戶操作。因此,你可以從onclick處理程序(顯然,包括Java applet中的處理程序)創建一個Open File對話框,但不能從例如。一個onload處理程序。

因此,您可能需要創建一個按鈕或<a href="#"/>供用戶點擊,然後在該事件處理程序內部調用showFolderSelect()