Использование пользовательского WebAppClassloader в Jetty - PullRequest
3 голосов
/ 11 октября 2011

Я пишу весеннее веб-приложение для нашей компании, и я получил заказы на шифрование классов нашего приложения.

Я нашел простую реализацию загрузчика классов, которая могла бы решить эту проблему здесь.Это в основном URLClassLoader, который реализует свои собственные методы loadClass и findClass.

Я следовал инструкциям из Jetty wiki @ eclipse, я создал свой собственный загрузчик классов, расширив WebAppClassLoader.Я реализовал findClass () и loadClass () методы, как предложено в первой ссылке (почти копирование и вставка).

Полный код моего загрузчика классов может быть.

. Я установил загрузчик классов, используя контекст в 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

(трассировка полного стека также по той же самой ссылке, что и выше)

(если я не реализую findClass () он использует реализацию из URLClassLoader и работает нормально.)

Можете ли вы увидеть, в чем может быть проблема?Буду рад любому ответу, спасибо

1 Ответ

0 голосов
/ 13 января 2012

Оставляя в стороне (отсутствие) достоинств шифрования классов в веб-приложении ...

Похоже, ваш загрузчик классов не работает, потому что вы не смогли сохранить /продублируйте соответствующие поведения из WebAppClassLoader

Посмотрите на источник для WebAppClassLoader, и вы увидите, что он имеет специальную обработку для классов "System" и "Server".Вы должны включить это поведение.

В результате вы получаете (вероятно) то, что ваш фильтр реализует ваш интерфейс «Фильтр» (т. Е. Класс Filter, загруженный вашим собственным загрузчиком классов), а не «Filter» сервера"интерфейс (загруженный корневым загрузчиком классов Jetty)

...