2011-10-11 93 views
3

我正在为我们公司编写基于弹簧的Web应用程序,并且我收到了应该加密我们应用程序类的命令。在Jetty中使用自定义的WebAppClassloader

我发现了一个简单的classloader实现,它可以做伎俩here。它基本上是一个实现自己的loadClass和findClass方法的URLClassLoader。

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

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

我已经在jetty中使用上下文设置了classloader。

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

我开始码头(没有任何加密的班,只是为了看看类加载器workz)和我有以下异常:

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 

(完整的堆栈跟踪也同样主旨链接如上)

(如果我不落实的findClass()它使用从URLClassLoader的执行和它运行得很好。)

ç你看到什么可能是问题?我会为任何回答很高兴,谢谢

回答

0

暂且不论(缺乏)案情加密班web应用程序内...

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

查看WebAppClassLoader的源代码,您将看到它对“系统”和“服务器”类具有特殊处理。您需要包含该行为。 (可能)的结果是你的过滤器正在实现你的“过滤器”接口(即你自己的类加载器加载的过滤器类),而不是服务器的“过滤器”接口(由Jetty的根加载的接口classloader)

相关问题