Общесерверная функциональность нескольких веб-приложений - PullRequest
6 голосов
/ 25 августа 2010

Мне нужно выполнить предварительную и последующую обработку всех входящих запросов на веб-сервер.Функциональность - это и ограничение доступа на уровне URL, и языковой перевод, но также и другие особые случаи, которые необходимо обрабатывать глобально.

Как правило, это может быть достигнуто с помощью фильтров сервлетов, но когда число веб-приложений растет, становится желательным несвязывать фильтры с каждым приложением, поскольку при внесении изменений в фильтр все приложения необходимо перестраивать и повторно развертывать.

Вместо этого я хотел бы установить фильтры глобально на сервере, и я нашел два возможныхрешения которых я не удовлетворяю ни одним из них.

  1. На Tomcat можно развернуть общесерверные фильтры в каталоге "lib" и настроить сервер web.xml насопоставить их с входящими запросами.Проблема, которую я вижу, заключается в том, что любые зависимости фильтра также должны быть развернуты глобально в каталоге lib.Из того, что я понимаю, это может привести к сложному решению конфликтов зависимостей с установленными приложениями.( Загружает ли Tomcat один и тот же файл библиотеки в память дважды, если они находятся в двух веб-приложениях? )

  2. Развертывание фильтров в простом веб-приложении, которое в основном действует какпрокси по крайней мере связывает фильтры с соответствующими зависимостями.Затем это приложение можно развернуть на сервере и принять все входящие запросы, прежде чем пересылать их целевому приложению с помощью параметра конфигурации crossContext.( RequestDispatcher пересылка между экземплярами Tomcat ) Однако для этого необходимо изменить URL-адреса, чтобы все ссылки указывали на «прокси».

Похоже, ни одно из этих решенийбыть удовлетворительнымОни оба зависят от платформы, поскольку полагаются на Tomcat.Похоже, что они оба имеют возможные проблемы и требуют особой обработки зависимостей.

Какова оптимальная практика при использовании функций сервера?

1 Ответ

1 голос
/ 25 августа 2010

Это моя непроверенная мысль (поэтому не лучшая практика) - это вариант варианта 2 в вашем списке.

Вы можете использовать Sitemesh (который фактически предназначен длянесколько веб-приложений с общим верхним / нижним колонтитулом - но в этом случае не используйте верхний / нижний колонтитул).

Разместите Sitemesh как отдельное веб-приложение с crossContext = true.

Sitemesh будет вызываться в качестве фильтра для каждого веб-приложения, поэтому URL-адреса, которые видит конечный пользователь, не изменятся вообще.Но вам нужно будет определить файл decortaor.xml для каждого веб-приложения.

Вы можете написать фактический процессор фильтров и создать цепочку после фильтра Sitemesh.Все запросы будут сначала поступать в приложение Sitemesh - затем в ваш фильтр - затем в отдельный сервлет в веб-приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...