在Jetty中使用自定义WebAppClassloader

时间:2011-10-11 13:31:21

标签: java spring jetty classloader

我正在为我们公司编写一个基于Spring的Web应用程序,并且我收到了应该加密应用程序类的订单。

我找到了一个简单的类加载器实现,它可以实现技巧here。它基本上是一个URLClassLoader,它实现了自己的loadClass和findClass方法。

我按照Jetty wiki @ eclipse的说明,通过扩展WebAppClassLoader创建了自己的类加载器。我按照第一个链接中的建议实现了 findClass() loadClass()方法(几乎是复制和粘贴)。

我的类加载器的完整代码可以在这里看到on gist

我在jetty中使用上下文设置了类加载器。

<Configure id="clsLdrCtx" class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/server</Set>
     <Set name="war">
       /home/me/workz/protection/classloading/server/target/server-0.0.0-SNAPSHOT.war</Set>
     <Set name="classLoader">
       <New class="org.eclipse.jetty.webapp.WebAppClassLoaderEncrypted">
         <Arg><Ref id="clsLdrCtx"/></Arg>
       </New>
     </Set>
</Configure>

我启动了jetty(没有任何加密类,只是为了查看类加载器是否工作)并且我得到了以下异常:

2011-10-11 14:59:58.401:WARN::FAILED encodingFilter: java.lang.IllegalStateException: class org.springframework.web.filter.CharacterEncodingFilter is not a javax.servlet.Filter

(完全堆栈跟踪也在与上面相同的gist链接上)

(如果我没有实现 findClass(),它使用来自URLClassLoader的实现,它运行得很好。)

你能看出可能出现的问题吗?我很乐意回答任何问题,谢谢

1 个答案:

答案 0 :(得分:0)

暂不考虑(缺乏)加密网络应用程序内的类的优点......

看起来您的类加载器无法正常工作,因为您无法维护/复制WebAppClassLoader中的相应行为

查看WebAppClassLoader的源代码,您将看到它对“System”和“Server”类有特殊处理。你需要包含这种行为。

您获得的结果(可能)是您的过滤器正在实现您的“过滤器”接口(即您自己的类加载器加载的Filter类),而不是服务器的“过滤器”接口(由Jetty的根类加载器加载的接口) )