我正在为我们公司编写一个基于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的实现,它运行得很好。)
你能看出可能出现的问题吗?我很乐意回答任何问题,谢谢
答案 0 :(得分:0)
暂不考虑(缺乏)加密网络应用程序内的类的优点......
看起来您的类加载器无法正常工作,因为您无法维护/复制WebAppClassLoader中的相应行为
查看WebAppClassLoader的源代码,您将看到它对“System”和“Server”类有特殊处理。你需要包含这种行为。
您获得的结果(可能)是您的过滤器正在实现您的“过滤器”接口(即您自己的类加载器加载的Filter类),而不是服务器的“过滤器”接口(由Jetty的根类加载器加载的接口) )