签名的applet在从javascript调用时给出AccessControlException:访问被拒绝

我有一个简单的自签名小程序(用keytool和jarsigner完成):

public class NetAppletLauncher extends JApplet { private static final long serialVersionUID = 1L; public void init() { exec("notepad c:/hello.txt"); } public void exec(String command) { try { // launch EXE and grab stdin/stdout and stderr Process process = Runtime.getRuntime().exec(command); // OutputStream stdin = process.getOutputStream(); InputStream stderr = process.getErrorStream(); InputStream stdout = process.getInputStream(); // "write" the parms into stdin // stdin.write(arguments.getBytes()); // stdin.flush(); // stdin.close(); // clean up if any output in stdout String line = ""; BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout)); while ((line = brCleanUp.readLine()) != null) { //System.out.println ("[Stdout] " + line); } brCleanUp.close(); // clean up if any output in stderr brCleanUp = new BufferedReader(new InputStreamReader(stderr)); while ((line = brCleanUp.readLine()) != null) { //System.out.println ("[Stderr] " + line); } brCleanUp.close(); } catch (Exception exception) { exception.printStackTrace(); } } } 

基本上,它的作用是执行’notepad c:/hello.txt’。

然后我将applet嵌入html中:

  

当我访问该页面时,JRE启动并询问我是否要启动此applet并且如果我信任它。 我按好了。 然后记事本开始 – 应该如此。 这里没问题。

但后来我将其添加到HTML页面中:

  

现在当我按下这个文本时,计算应该开始 – 对吧? 但这给了我:

 java.security.AccessControlException: access denied (java.io.FilePermission <> execute) at java.security.AccessControlContext.checkPermission(Unknown Source) 
  • 怎么了? 为什么它现在给我一个安全例外,但它可以在之前启动记事本?

Java 2安全模型(大致)要求必须为访问控制上下文(acc)授予堆栈中的每个帧以获得该权限。 JavaScript位于堆栈中,没有文件访问权限。

解决了Java中的问题:

 exec(getParameter("command")); 

然后在JavaScript中:

  

我同意:禁止从javascript操作已签名的applet,解决方法是在页面文档中的javascript中重写applet标记。

我发现这个来源有一些理论certificate我们是对的http://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote

实际上,从javascript调用applet就像调用unsigned applet一样(在jsnote中指定: http ://docs.oracle.com/javase/tutorial/deployment/applet/security.html#jsNote。这很好,当你有效时’使用不允许更改的类,但由于您是java类的作者,因此您始终可以包装需要从javascript调用的特定方法以在特权模式下执行,如下所示:

 AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { exec(command); return null; } }); 

它应该工作正常。 (这是@ Jean-Philippe Jodoin提出的评论中的建议,但提供的链接已经破了)