繁体   English   中英

从JavaScript调用时,已签名的Java Applet会提供AccessControlException

[英]Signed Java Applet gives AccessControlException when calling from JavaScript

首先,我知道我的问题和这里的一样 但是这个问题并没有帮助我。

我有自签名的小程序。

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

本质上,您不允许从小程序在用户计算机上执行代码。 这可能会引起很多麻烦。 但是,请考虑使用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>

上面的代码示例没有错。 这两种情况Desktop.getDesktop().open()Runtime.getRuntime().exec()可以正常工作。

我的问题是罐子包装不好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM