【问题标题】:security exception when running java application outside eclipse在eclipse之外运行java应用程序时出现安全异常
【发布时间】:2014-03-11 13:34:05
【问题描述】:

我正在使用 birt 开发 java web 应用程序,当我从 eclipse 运行应用程序时,它按预期工作,但是当我从 netbeans 运行它或在 tomcat 上手动部署它时,它会出错

Caused by: java.lang.IllegalArgumentException: securityDomain should be null if setSecurityController() was never called
at org.mozilla.javascript.Context.compileImpl(Context.java:2340)
at org.mozilla.javascript.Context.compileString(Context.java:1359)
at org.mozilla.javascript.Context.compileString(Context.java:1348)
at org.eclipse.birt.report.engine.javascript.JavascriptEngine$3.run(JavascriptEngine.java:240)
at org.eclipse.birt.report.engine.javascript.JavascriptEngine$3.run(JavascriptEngine.java:1)

请问如何解决?

【问题讨论】:

    标签: java eclipse netbeans tomcat7 birt


    【解决方案1】:

    我几天前将此报告为严重的bug 429944,您应该在 bugzilla 中投票。

    据我所知,有两种可能的解决方法:

    选项 1: 如果可能,禁用 Tomcat 服务器的安全管理。默认情况下它被禁用,但在您的上下文中似乎不是。检查参数“-security”是否用于启动Tomcat,并尝试将其删除。

    选项 2: 正如错误描述中所建议的,为了快速修复,应该在 birt 的源代码中更改两种方法。

    【讨论】:

    • 我禁用了安全管理器,但我在项目中使用的开源库 net.nicholaswilliams.java.licensing 创建了一个新库,这就是异常持续存在的原因
    • 在这种情况下,由于无法在此许可库中禁用 securityManager,恐怕您需要像我加入的 bugzilla 链接中提到的那样修补 BIRT。或者可能会修补许可库以防止它创建 SecurityManager
    • 我可以确认遵循bug 429944 comment 7 的建议可以正常工作。我正在使用与 OP 指示的完全相同的 BIRT 运行时 JAR 版本。
    【解决方案2】:

    在调用报告之前尝试将System.setSecurityManager(null); 放入您的代码中。对于每个 JVM 实例,您应该只需要执行一次。

    【讨论】:

    • 但是还需要考虑设置为null的影响。见stackoverflow.com/questions/19487407/…
    • @radimpe - 该链接仅讨论小程序 - 我假设这只是服务器端。你是对的,如果这是一个小程序,关闭安全管理器是个坏主意。如果是服务器端,您仍然需要考虑明确关闭安全管理器会产生什么影响(如果有的话),但根据我的经验,大多数网络应用程序往往不会在启用安全管理器的情况下运行
    • 感谢您的回复,我正在尝试您的解决方案,现在我有一个新错误原因:java.lang.SecurityException:禁止设置除 LicenseSecurityManager 之外的 SecurityManager。在 net.nicholaswilliams.java.licensing.LicenseSecurityManager.checkPermission(LicenseSecurityManager.java:260)
    • 您是否自己添加了 net.nicholaswilliams.java 包,或者它们是 birt 的一部分?
    • 我自己添加的
    【解决方案3】:

    您不应该停用安全管理器! 此处提示绕过错误:

    Context context = Context.enter( );
    context.setSecurityController( ScriptUtil.createSecurityController( ) );
    

    这两行应该可以解决问题。我在org.eclipse.birt.report.engine.javascript.JavascriptEngineFactory 类文件中发现了它,所以基本上你更喜欢直接调用JavascriptEngineFactory 类来以一种好的方式初始化所有内容。

    【讨论】:

      【解决方案4】:

      我使用 birt 运行时 4.2.2 而不是使用 4.3.1 版本, 现在一切正常,即使没有禁用安全管理器。 谢谢大家的帮助

      【讨论】:

        猜你喜欢
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多