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

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

我遵循Jetty Wiki @ eclipse的指示,通过扩展WebAppClassLoader创建了自己的类加载器。我已经实现了第一个链接(几乎复制并粘贴)中建议的findClass()和loadClass()方法。

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

我在码头上使用上下文设置了类加载器。

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


我开始码头(没有任何加密的类,只是看classloader是否工作),我得到以下异常:

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的实现,并且运行得很好。)

您知道可能是什么问题吗?我很乐意为您解答,谢谢

最佳答案

抛开对Web应用程序内的类进行加密的优点(不足)...

看来您的类加载器无法正常工作,因为您未能从WebAppClassLoader维护/复制适当的行为

查看WebAppClassLoader的源代码,您将看到它对“系统”和“服务器”类具有特殊处理。您需要包括该行为。

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

关于java - 在Jetty中使用自定义WebAppClassloader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7726848/

10-12 06:25