我有一个在 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 文件修复了该问题。但这不是我想要的,小程序应该在普通机器上运行,并带有默认的 java.policy 文件。因此必须从代码中修复它。

有帮助吗?

解决方案

您是从 applet 主线程还是从使用 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
    }
}

其他提示

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

建议使用 AccessManager 确实是强制性的,否则将会失败。但是,当从 start() 或 init() 调用 Web 服务时,您也需要执行相同的操作。

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

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

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

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

System.setSecurityManager(null);

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top