我们在生产中遇到了一个奇怪的问题。我们是部署在Tomcat 7中的Web应用程序。我们使用Antisamy-1.5.3.jar进行XSS预防。每个用户请求都被一个过滤器拦截,该过滤器扫描任何恶意内容的请求。 这个设置在Tomcat 6中都很好,超过一年。我们迁移到Tomcat 7.用户在打开应用程序时打开和关闭NoClassDefFoundError(不一致)但是当Tomcat重新启动时,它可以正常工作。
以下是抛出异常的流程
用户请求被owasp.validator.html拦截了AntiSamyFilter和scan方法.AntiSamy类(AntiSamy内部类)被调用。
以下是扫描方法的代码
public CleanResults scan(String taintedHTML, Policy policy)
throws ScanException, PolicyException
{
return new AntiSamyDOMScanner(policy).scan(taintedHTML);
}
当上面的代码中引用了AnitSamyDOMScanner类时,会调用AntiSamyDOMScanner - AbstractAntiSamyScanner超类的静态init块,如下所示
private static ResourceBundle getResourceBundle() {
try {
return ResourceBundle.getBundle("AntiSamy", Locale.getDefault()); }
catch (MissingResourceException mre) {
}
return ResourceBundle.getBundle("AntiSamy", new Locale("en", "US"));
}
这是引发异常的地方,因为tomcat由于某种原因无法加载资源包 - 根文件中的jar文件中存在AntiSamy_en_US.properties文件。 由于这是静态块中的错误,因此抛出ExceptionInInitializer最终导致NoClassDefFoundError。
以下是同时查看的两个异常 - 我们可以看到NoClassDefFoundError是由于AbstractAntiSamyScanner的静态init块中的异常引起的。
SEVERE: Servlet.service() for servlet [jsp] in context with path [/app] threw exception [javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner] with root cause
java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner
at org.owasp.validator.html.AntiSamy.scan(AntiSamy.java:93)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:124)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner StackTrace: javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner at
我们已经尝试复制Tomcat lib下的Antisamy.properties以及WEB-INF / classes但它没有用。 有什么可能导致AbstractAntiSamyScanner找不到jar中的资源包的想法吗?