2011-07-12 20 views
2

我有一個數字簽名的Java Applet。
我需要能夠從javascript調用一個函數,將xml文件寫入用戶文件夾。已簽名的Java小應用程序在將文件寫入本地系統時導致AccessControlException

我已經在applets初始化函數中創建一個子文件夾,創建一個文件並附加到該文件中的代碼。這運行沒有錯誤。 當相同的代碼是一個函數(見下文),其直接調用從JavaScript訪問控制拋出異常內:

public boolean createLocalXMLFile(String XML) { 
    String path = BaseDirectory.baseDirectory + "\\TestFolder"; 
    try { 
     boolean status; 
     status = new File(path).mkdir(); 

     UUID fName = UUID.randomUUID(); 

     FileWriter fstream = new FileWriter(path + "\\"+fName+".xml"); 
     BufferedWriter out = new BufferedWriter(fstream); 
     out.write(XML); 
     //Close the output stream 
     out.close(); 

     return true; 
    }catch (Exception ex) { 
     System.out.println("createXMLError \n"+ex.toString()); 
     return false; 
    } 

} 

*註釋基目錄是指用戶本地路徑

Java控制檯錯誤 java.security.AccessControlException:訪問被拒絕(java.io.FilePermission中的C:\用戶\理查德\ HYTEC \ AppStore的\ 0d927ab7-74ba-449A-9db4-98e62cd0f53b.txt寫)

回答

2

如果您使用JavaScript調用applet的方法,則得到的權限是您的applet的權限和JavaScript橋的權限的交集 - 這意味着您的情況沒有權限訪問本地文件。

要使用applet的權限運行代碼,請將關鍵代碼包裝在AccessController.doPrivileged(...)中。當然,首先檢查一下,即使被惡意代碼調用,這也不能做任何惡意的事情。

0

首先確保您的policy文件設置具有適當的權限。您可以將其設置爲all-permissions進行調試,並確保這不是您的問題。

什麼操作系統你遇到這個問題?你有與XP相同的問題嗎?我問的原因是因爲即使已簽名的具有策略文件授予的完全權限的小程序在運行Windows Vista或Windows 7的工作站上也沒有完整文件訪問權限。

這是因爲文件夾完整性級別的概念,即使UAC被關閉,http://msdn.microsoft.com/en-us/library/bb625962.aspx

當地的小應用程序商店在默認情況下已經設置爲Low的完整性級別,這意味着它本質上是不可信和處理這些directorys只能對文件和流程等Low完整性directorys運行完全權限運行。系統文件夾的完整性爲High,其他文件夾的默認值爲Medium

這些都可以改變幸運的是,有一個免費的命令行工具,可以幫助您更改文件夾的完整性級別,而無需使用控制面板管理工具。 http://www.minasi.com/apps/

希望這一切都有所幫助。

+0

感謝您的迴應,儘管已簽名的applet能夠在init函數內執行相同的操作。我正在使用win 7,ie9,並嘗試使用chrome和xp以及相同的響應。更新策略文件不適用於將使用該應用程序的環境 –

+0

我覺得你在'init()'函數中擁有權限而在其他地方沒有權利,這讓我覺得很奇怪。這篇文章總結了關於政策文件和Java小程序的嚴峻形勢,http://www.velocityreviews.com/forums/t542064-distributing-java-policy-with-applet-jar.html –

+0

假設你說的是正確的,你能創建一個在init方法中每5秒喚醒一次的線程並檢查一個全局布爾變量來執行某種文件IO操作嗎?我知道這聽起來像是黑客,但它可能工作。 –

相關問題