1

我有一个在 tomcat 5.5 上运行的 java 小程序。它已签名(-selfcert)。java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)当我的 Applet 尝试连接到 web 服务时(已经在这一行中),我仍然得到一个异常:

ws_locator = new My_WebserviceLocator(ws_adress + "?wsdl",
                new javax.xml.namespace.QName("http://impl.webservice", "My_Webservice"));

由于这里有一些类似的问题,我阅读了它们:

  • 是的,小程序已签名。我用-verify检查了它。

  • Tomcat 安全异常,可能是,但我已添加到 catalina.policy:

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" {
        permission java.security.AllPermission;    };
    

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/applet.jar" { permission java.security.AllPermission; };

并且通常的东西也在那里:

grant codeBase "file:${java.home}/jre/lib/ext/-" {
        permission java.security.AllPermission;
};

没有结果。

好的,快速更新,添加:

grant{
        permission java.security.AllPermission;
};

到本地 java.policy 文件修复问题。但那不是我要找的,小程序应该运行在一台带有 dafault java.policy 文件的普通机器上。所以它必须从代码中修复。

4

4 回答 4

8

您是从applet 主线程调用WS,还是从使用javascript 调用applet 方法启动的线程调用WS?

请参见下面的示例。

希望能帮助到你。

public class MyApplet extends JApplet {

    @Override
    public void start() {
        // It will work if your applet is signed
        callWebService();
    }

    public void methodCalledFromJavascriptWrong() {
        // It will NOT work even if your applet is signed
        callWebService();

    }

    public void methodCalledFromJavascriptGood() {
        AccessController.doPrivileged(new PrivilegedAction() {

            public Object run() {
                // It will work if your applet is signed
                callWebService();
                return null;
            }

        });

    }

    private void callWebService() {
        //Here you call your web service
    }
}
于 2009-10-16T13:12:23.850 回答
0

如果您正在使用您的小程序中的其他库(jar),它们与任何受限资源交互,它们也应该被签名。所以给出整个堆栈跟踪和 My_WebserviceLocator。(并且不要使用下划线)。例如,尝试签署axis.jar。

于 2009-11-22T17:10:24.163 回答
0

作为临时解决方法,您可以禁用 SecurityManager。当然这有一些安全问题,但至少你将能够追踪到 SecurityManager(即权限问题)。

System.setSecurityManager(null);

如果这确实有效,我的猜测是您配置了错误的策略文件。从浏览器运行小程序时,我几乎可以肯定小程序启动器将是一个普通的消费者 JRE,而不是与 JDK 捆绑在一起的 jre。

于 2009-11-27T13:56:01.260 回答
0

在服务器上设置权限不是解决方案。抱怨的是浏览器中的安全管理器。

建议使用 AccessManager 是绝对强制性的,否则将失败。但是在从 start() 或 init() 调用 web 服务时也需要这样做。

我可以问:WebService 调用是您拥有 applet 的唯一原因吗?最好放置一个代理 servlet 以避免相同的域策略限制。然后你可以在浏览器中使用纯 HTML + Javascript。

如果在小程序完全启动之前从 JS 调用小程序可能会失败,因此您应该等待小程序准备好。

于 2009-11-27T14:49:29.517 回答