0

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

我已经确定 EJB 的源代码正在设置使用的具体实现javax.xml.parsers.DocumentBuilderFactory

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

我想防止这种情况——但来自 WAR 文件。

我的耳朵是:

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

有一个关于实现我现在正在研究的自定义java.lang.SecurityManager的检测 System.setProperty 方法调用问题,但我仍然不明白 WAR 文件如何影响 3rd-party-ejb.jar 行为。

什么是正确的解决方案?

4

1 回答 1

1

看看这个SO 答案。我相信它描述了一个非常简单的解决您的问题的方法。

更新:为了解决评论。

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

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);

在您试图阻止影响的代码有机会运行之前。

于 2013-03-16T04:45:36.610 回答