2012-07-02 20 views
2

我想使Applet能夠將文件下載到計算機,然後在關聯的編輯器中打開它們(當文件被保存時,它應該被上傳回再次)。但是,在花費數小時才能使其運行之前,我必須確保它實際上是可管理的(使用Java桌面應用程序而不是Applet)。自簽名Applet在寫入文件時拋出SecurityException

因此,我寫了一個簡單的小程序,創建一個文件,如果它不存在。應用程序是簽署並加載在瀏覽器中,因爲它應該。寫入屏幕下面:

IO異常:訪問被拒絕

我已經標記了不同的錯誤,所以我知道哪一個失敗。以下是我的小程序:

import javax.swing.*; 
import java.security.*; 
import java.io.*; 

public class DocumentApplet extends JApplet 
{ 
    private static final long serialVersionUID = -2354727776089972258L; 

    public void start() 
    { 
     add (new JButton ("Hello, World")); 

     AccessControlContext acc = (AccessControlContext) System.getSecurityManager().getSecurityContext(); 
     try 
     { 
      acc.checkPermission(new FilePermission("test.txt", "write")); 
     } 
     catch (SecurityException e) 
     { 
      add (new JLabel ("Permission Exception: " + e.getMessage())); 
      return; 
     } 

     try 
     { 
      File f = AccessController.<File>doPrivileged(new PrivilegedAction<File>() 
      { 
       public File run() 
       { 
        return new File ("test.txt"); 
       } 
      }); 

      if (! f.exists()) 
      { 
       f.createNewFile(); 
      } 
     } 
     catch (AccessControlException e) 
     { 
      add (new JLabel ("Access: " + e.getMessage())); 
     } 
     catch (IOException e) 
     { 
      add (new JLabel ("IO Exception: " + e.getMessage())); 
     } 
    } 
} 

這是最後一個引發的異常。請注意,我所做的第一件事是檢查權限。該檢查不會失敗。

Applet是自簽名的,但這只是暫時的。 我不想花數百美元購買證書,如果小程序失敗..

當我使用appletviewer運行應用程序時,代碼有效。沒關係,但是我需要知道,當我購買真正的證書時它會起作用。

HTML代碼:

<applet code="DocumentApplet" archive="applet.jar" width="300" height="200"> 
</applet> 

環境:Windows7的JDK + 1.7.0_05

PS:我也花了最後兩天讀#2和谷歌搜索。我堅信我所做的一切都是我應該做的......

+0

只是爲了檢查你可以運行你的瀏覽器作爲管理員,看看它是否寫入? –

+0

什麼是拋出異常的棧跟蹤? – trashgod

+1

對於***每捕獲一次,請調用'Throwable.printStackTrace()' - 我很驚訝你在沒有看到這個建議的情況下瀏覽了2天! –

回答

0

我不知道這樣做的原因是,但我設法寫文件成功地用前綴的文件名:

System.getProperty("java.io.tmpdir") 

System.getProperty("user.home") 

這是一個狂射,因爲自該錯誤消息告訴我「拒絕訪問」,我認爲這是因爲安全性的東西。

因此所有其他誰可能有同樣的問題:

  • 不要寫文件做任何其他目錄比提供的兩個。請記住,Windows通常不允許將文件寫入C:\,即使對於使用Windows資源管理器的用戶也是如此。
相關問題