2012-06-28 41 views
0

首先,我知道我的問題與in here相同。但這個問題並沒有幫助我。已簽名的Java Applet在從JavaScript調用時給出AccessControlException

我有自我簽名的小程序。

jarsigner -verify sJSApplet.jar 
jar verified. 

Warning: 
This jar contains entries whose signer certificate will expire within six months. 

Applet的目的是從LAN機器打開MS Word文檔。 到目前爲止,我已經嘗試開放使用Desktop.open()Runtime.exec()。與AccessController.doPrivileged和沒有。我總是得到java.security.AccessControlException: access denied

我沒有選擇。我還能做什麼?

我無法使用java.policy文件。

HTML

<html> 
    <head> 
     <script> 
      function openFile(command) { 
        var applet = "<object type='application/x-java-applet' height='100' width='100' name='jsApplet'><param name='code' value='com.avacoda.swing.JSApplet'/><param name='archive' value='sJSApplet.jar' /><param name='mayscript' value='true'/><param name='filePath' value='C:\\note.txt'/>Applet failed to run. No Java plug-in was found.</object>"; 

        var body = document.getElementsByTagName("body")[0]; 
        var div = document.createElement("div"); 
        div.innerHTML = applet; 
        body.appendChild(div); 
      } 
     </script> 
    </head> 
    <body> 
     <a href="#" onclick="openFile('C:/note.txt');">Open file</a> 
    </body> 
</html> 

Java代碼:

public class WordApplet extends JApplet { 

    @Override 
    public void init() { 
     openFile(getParameter("filePath")); 
    }; 

    public void openFile(final String path) { 
     AccessController.doPrivileged(new PrivilegedAction<Object>() { 

      @Override 
      public Object run() { 
       try { 
         Runtime.getRuntime().exec("winword " + path); 
         //Desktop.getDesktop().open(new File(path)); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }); 
    } 
} 

完整的堆棧跟蹤

java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkExec(Unknown Source) 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at com.test.applet.JSApplet$1.run(JSApplet.java:34) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.avacoda.swing.JSApplet.openFile(JSApplet.java:29) 
    at com.avacoda.swing.JSApplet.init(JSApplet.java:25) 
    at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
basic: Applet initialized 
+0

顯示完整的堆棧跟蹤請 –

+0

添加堆棧跟蹤 –

+2

請參閱[* Applets可以和不可以執行的操作*](http://docs.oracle.com/javase/tutorial/deployment/applet/security.html)和[示例](http://blog.danieldee.com/2009/07/javascript-and-applet-communication.html)。 – trashgod

回答

0

上面的代碼示例沒有任何問題。 Desktop.getDesktop().open()Runtime.getRuntime().exec()都可以很好地工作。

我的問題是糟糕的包裝罐子。

0

你本身不支持允許從一個applet執行用戶機器上的代碼。這可能會導致很多麻煩。但是,請考慮使用Applet將文件輸出到用戶的計算機,然後使用jScript和ActiveX在記事本中打開文檔。我列出了一個我在網上找到的示例:

<html> 
    <head> 
     <script type="text/javascript"> 
      function runApp(which) { 
       WshShell = new ActiveXObject("WScript.Shell"); 
       WshShell.Run (which,1,false); 
      } 
     </script> 
    </head> 
    <body> 
     <!-- Two ways to create a link to run the app. --> 
     <font onClick="runApp('file://c:/winnt/notepad.exe');" style="cursor: hand;"> 
      <u>Notepad</u> 
     </font> 
     <br> 
     <!-- Or use <a> descriptor --> 
     <a href="runApp('file://c:/test.bat');">Batch File</a> 
    </body> 
</html> 
+0

好吧,是不是一樣?讀取文件並寫入文件?無論如何。我需要從網絡上打開文件,因爲它必須在編輯後保存回同一個地方。所以下載文件到系統然後打開它不是一個選項。 –

+1

我的目標是什麼?只需將所有信息寫入文件,然後將該文件輸出到系統,您應該使用文本編輯器以編程方式將數據寫入文件。 –

+0

Word文檔存儲在網絡機器上。用戶應該可以通過點擊鏈接來打開它。必須用MS Word打開文件才能編輯。編輯後的文件必須保存在相同的位置。這意味着沒有「另存爲...」 –

相關問題