java - 如何防止 Java 系统属性发生更改(在 Java EE 中)?

标签 java jakarta-ee ejb code-access-security

我维护的一个应用程序使用第三方商业 EJB 实现。我没有能力更改源代码,但我可以阅读它。

我已确定 EJB 的源代码正在使用以下方式设置 javax.xml.parsers.DocumentBuilderFactory 的特定实现:

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
    "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");

我想阻止这种情况发生——但是要通过 WAR 文件来阻止。

我的 EAR 是:

EAR
  application.xml
  weblogic-application.xml
  3rd-party-ejb.jar
  my-web-app.war

Detecting System.setProperty method invocations关于实现自定义的问题java.lang.SecurityManager我现在正在研究,但我仍然不明白 WAR 文件如何影响 3rd-party-ejb.jar 行为。

正确的解决方案是什么?

最佳答案

看看this所以回答。我相信它描述了一个非常简单的解决方案来解决您的问题。

更新:为了解决评论。

因此,如上面的链接所示,您可以实现自己的属性并用它替换系统属性。这是我将如何实现它以防止更改以下内容

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");

没有任何影响:

public class MyProperties extends Properties {

    public MyProperties(Properties properties) {
        super(properties);
    }

    @Override
    public Object setProperty(String key, String value) {
        if ("javax.xml.parsers.DocumentBuilderFactory".equals(key) && "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl".equals(value)) {
            return null;
        } else {
            return super.setProperty(key, value);
        }
    }
}

然后确保您运行(例如在 servlet 生命周期监听器中):

MyProperties newProps = new MyProperties(System.getProperties());
System.setProperties(newProps);

在您试图阻止产生效果的代码有机会运行之前。

关于java - 如何防止 Java 系统属性发生更改(在 Java EE 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15435732/

相关文章:

java - OpenJDK 无法在 jar 中找到主类,而 OracleJDK 可以

jakarta-ee - 如何在 Wildfly 10 中以编程方式创建数据源?

jakarta-ee - 更新资源/热部署不适用于 tomee 和 IntelliJ

java - 需要澄清有关交易属性

java - Java EE 中的异步执行

java - Google Cloud Messaging 服务器端注册?

java - 无法将设备连接到本地主机

java - 困惑 - 二叉树的高度

java - 部署 Java EE 应用程序后执行任务

jakarta-ee - EJB 事务中的默认属性