4

我是新手 Java 开发人员,在尝试使用 JBOSS 和 ESAPI 开发一些网站以确保安全时,我遇到了异常

java.lang.ClassCastException: org.jboss.logmanager.log4j.BridgeLogger cannot be cast to org.owasp.esapi.Logger

当我尝试使用 OWASP 的 ESAPI 包时。

我的 Maven 项目由 2 个模块组成:oak-parent 和 Oak-web。

Maven依赖树如下:

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ oak-web ---
[INFO] org.me.oak:oak-web:war:0.0.1-SNAPSHOT
[INFO] +- javax:javaee-api:jar:6.0:provided
[INFO] +- javax.servlet:javax.servlet-api:jar:3.0.1:provided
[INFO] +- log4j:log4j:jar:1.2.16:provided
[INFO] +- org.reflections:reflections:jar:0.9.8:compile
[INFO] |  +- javassist:javassist:jar:3.12.1.GA:compile
[INFO] |  \- dom4j:dom4j:jar:1.6.1:compile
[INFO] +- org.jboss:jboss-vfs:jar:3.0.1.GA:provided
[INFO] |  \- org.jboss.logging:jboss-logging:jar:3.0.0.CR1:provided
[INFO] +- org.owasp.esapi:esapi:jar:2.0.1:compile
[INFO] |  +- commons-configuration:commons-configuration:jar:1.5:compile
[INFO] |  |  +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  |  |  +- logkit:logkit:jar:1.0.1:compile
[INFO] |  |  |  +- avalon-framework:avalon-framework:jar:4.1.3:compile
[INFO] |  |  |  \- javax.servlet:servlet-api:jar:2.3:compile
[INFO] |  |  \- commons-digester:commons-digester:jar:1.8:compile
[INFO] |  |     \- commons-beanutils:commons-beanutils:jar:1.8.3:compile
[INFO] |  +- commons-beanutils:commons-beanutils-core:jar:1.7.0:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.2:compile
[INFO] |  +- xom:xom:jar:1.1:compile
[INFO] |  |  +- xerces:xmlParserAPIs:jar:2.6.2:compile
[INFO] |  |  +- xalan:xalan:jar:2.7.0:compile
[INFO] |  |  \- jaxen:jaxen:jar:1.1-beta-8:compile
[INFO] |  |     \- jdom:jdom:jar:1.0:compile
[INFO] |  +- org.beanshell:bsh-core:jar:2.0b4:compile
[INFO] |  \- org.owasp.antisamy:antisamy:jar:1.4.3:compile
[INFO] |     +- org.apache.xmlgraphics:batik-css:jar:1.7:compile
[INFO] |     +- net.sourceforge.nekohtml:nekohtml:jar:1.9.12:compile
[INFO] |     \- commons-httpclient:commons-httpclient:jar:3.1:compile
[INFO] |        \- commons-codec:commons-codec:jar:1.7:compile
[INFO] +- org.jsoup:jsoup:jar:0.2.2:compile
[INFO] |  \- commons-lang:commons-lang:jar:2.4:compile
[INFO] +- xerces:xercesImpl:jar:2.11.0:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] +- org.apache.xmlgraphics:batik-codec:jar:1.7:compile
[INFO] |  +- org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile
[INFO] |  +- org.apache.xmlgraphics:batik-bridge:jar:1.7:compile
[INFO] |  |  +- org.apache.xmlgraphics:batik-anim:jar:1.7:compile
[INFO] |  |  +- org.apache.xmlgraphics:batik-ext:jar:1.7:compile
[INFO] |  |  +- org.apache.xmlgraphics:batik-parser:jar:1.7:compile
[INFO] |  |  \- org.apache.xmlgraphics:batik-script:jar:1.7:compile
[INFO] |  \- org.apache.xmlgraphics:batik-util:jar:1.7:compile
[INFO] \- org.apache.xmlgraphics:batik-transcoder:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:fop:jar:0.94:compile
[INFO]    |  +- org.apache.xmlgraphics:xmlgraphics-commons:jar:1.2:compile
[INFO]    |  +- commons-io:commons-io:jar:2.4:compile
[INFO]    |  +- org.apache.avalon.framework:avalon-framework-api:jar:4.3.1:compile
[INFO]    |  \- org.apache.avalon.framework:avalon-framework-impl:jar:4.3.1:compile
[INFO]    +- org.apache.xmlgraphics:batik-dom:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-gvt:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-svggen:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-xml:jar:1.7:compile
[INFO]    \- xml-apis:xml-apis-ext:jar:1.3.04:compile

我已经创建了 jboss-deployment-structure.xml 来尝试排除 log4j(文件是在 Oak-parent/META-INF 中创建的:

<jboss-deployment-structure>
 <ear-subdeployments-isolated>true</ear-subdeployments-isolated>
  <deployment>
    <exclusions>
      <module name="org.apache.log4j" />
      <module name="org.jboss.logging" />
      <module name="org.jboss.logmanager" />
      <module name="org.jboss.log4j.logmanager" />
      <module name="org.jboss.logmanager.log4j" />
    </exclusions>
  </deployment>
  <sub-deployment name="oak-web.war">
   <exclusions>
      <module name="org.apache.log4j" />
      <module name="org.jboss.logging" />
      <module name="org.jboss.logmanager" />
      <module name="org.jboss.log4j.logmanager" />
      <module name="org.jboss.logmanager.log4j" />
    </exclusions>
  </sub-deployment>
</jboss-deployment-structure>

但它仍然没有任何帮助。

你们中有人知道这个问题的解决方案吗?与 jboss 5 相比,JBoss 类加载器有点变化。

4

4 回答 4

2

将 log4j.properties 文件放在资源文件夹下,其中包含以下行:

log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory
于 2013-10-18T12:09:47.343 回答
2

编辑(13.10.2014): 我建议使用 2.1.0 版本,它使用 log4j 类加载器解决了这个问题。


最后我设法解决了这个问题。结合了互联网上可用的几种方法。

  1. 我已经创建了oak-ear
  2. 在橡木耳中,我添加了src/main/application/META-INF/jboss-deployment-structure.xml

    <?xml version='1.0' encoding='UTF-8'?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
        <deployment>
            <dependencies>
                <module name="org.mickula.mylog" />
            </dependencies>
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
        </deployment>
        <sub-deployment name="oak-web.war">
            <dependencies>
                <module name="org.mickula.mylog" />
            </dependencies>
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
        </sub-deployment>
    </jboss-deployment-structure>
    
  3. 接下来在jboss我复制org/apache/log4j/main/log4j.jarorg/mickula/mylog/main/并在那里创建的目录中module.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <module xmlns="urn:jboss:module:1.0" name="org.mickula.mylog">
        <resources>
            <resource-root path="log4j-1.2.16.jar"/>
        </resources>
        <dependencies>
            <module name="javax.api"/>
        </dependencies>
    </module>
    

    此更改允许我创建自己的log4j.properties文件。我在jboss/standalone/configuration/.

  4. log4j.properties最后,我通过启动脚本将JBoss 指向新文件:在jboss/bin/standalone.conf我添加的文件末尾:

    JAVA_OPTS="$JAVA_OPTS -Dlog4j.configuration=file://URL_TO_THE_JBOSS/jboss711/standalone/configuration/log4j.properties"

现在使用 ESAPI 成功运行 JBoss。谢谢你的帮助。

于 2013-10-21T05:42:32.947 回答
0

您是否尝试过此排除:

<jboss-deployment-structure>
    <deployment>
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
        <exclusions>
            <module name="org.apache.log4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

我刚刚在这个网站上找到了。该建议是否有效并没有得到验证,但您可以尝试一下。

编辑:

另一种排除方法log4j是使其在 Maven 中具有:

<exclusion>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
</exclusion>

对于esapi. 这能达到预期的效果吗?(我看到你在依赖树上有它,我找了它,因为我读了这个链接)。

于 2013-09-11T09:39:18.917 回答
0

您没有提到您的 JBoss 应用程序服务器的版本,但我猜它是 7.X
两个接口 org.owasp.esapi.reference.Log4JLogger 和 org.jboss.logmanager.log4j。BridgeLogger 扩展了 org.apache.log4j.Logger。

这实际上是 jboss 问题与 log4j 的一个变体,常见的解决方案是按照 mico 的建议排除 log4j。

从依赖关系树中,我可以看到您没有从依赖于 log4j 的 esapi 2.0.1 依赖项中获取 log4j(添加您的 pom 会很有用)。所以看起来你的pom很好。

我猜你仍然从你的类路径中的某个地方获得 log4j。
尝试使用以下变体(在每个级别上排除)。

<jboss-deployment-structure>
              <deployment>
                  <exclusions>
                  <module name="org.apache.log4j" />
                  </exclusions>
              </deployment>
              <sub-deployment name="MyWeb.war">
                    <exclusions>
                    <module name="org.apache.log4j" />
                    </exclusions>
              </sub-deployment>
              <sub-deployment name="MyBeans.jar">
                <exclusions>
                  <module name="org.apache.log4j" />
                </exclusions>
              </sub-deployment>
</jboss-deployment-structure> 

另请参阅以下答案 Using application's Log4J configuration under JBoss 7.1.1

于 2013-09-16T07:32:44.300 回答