我正在为我们的公司编写基于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/