Подделка/установка контекстного пути Tomcat

Мы запускаем около 30 веб-приложений на различных экземплярах Tomcat за балансировщиками нагрузки и обратными прокси-серверами Apache, используя mod_jk. Общедоступный URL-адрес каждого приложения настраивается в конфигурации Apache mod_jk, которая проксирует серверные Tomcats. Серверная часть Tomcat запускает приложение по пути контекста, который соответствует общедоступному URL-адресу.

e.g.

domain.com/foo/bar/webapp -- mod_jk --> tomcat/foo/bar/webapp

Это связано с тем, что приложения создают ссылки в JSP, используя ${pageContext.request.contextPath}, например.

<script src="${pageContext.request.contextPath}/resources/js/image-manipulation.js" >     </script>

Я хотел бы сделать это более слабо связанным и «контейнеризировать» веб-приложения, чтобы каждое из них запускалось в своем собственном контейнере Tomcat в контексте по умолчанию, то есть /, без необходимости знать, каков их общедоступный URL-адрес. Это упростило бы управление конфигурацией Tomcat и отображениями mod_jk.

Проблема в том, как приложение может создавать абсолютные ссылки внутри себя, не зная, каков его конечный общедоступный URL-адрес? Есть ли способ передать URL-адрес в запросе mod_jk и заставить Tomcat переопределить вызовы ${pageContext.request.contextPath} с помощью этого URL-адреса?

Или лучше использовать что-то вроде mod_substitute в Apache, чтобы заменить фиксированную строку на странице URL-адресом, когда он выходит из Apache? Это кажется неэффективным, поскольку Apache должен затем сканировать все страницы, выполняющие поиск и замену.

Или лучше просто оставить все как есть и использовать контекстный путь как сейчас?


person Mark    schedule 02.09.2014    source источник


Ответы (1)


Единственное решение, о котором я могу думать, было бы чем-то вроде:

  • настройка mod_jk для отправки желаемого contextPath в качестве переменной через JkEnvVar (будет доступно в tomcat как параметр запроса)
  • иметь фильтр в вашем веб-приложении, обертывающий запрос и использующий эту переменную для переопределения getContextPath()
  • также оберните свой ответ, чтобы правильно обрабатывать sendRedirect() и другие подобные методы (может быть, это не так просто).

Конечно, если бы кот мог сделать все это за вас...

person Xavier Dury    schedule 19.09.2014