2016-08-22 3 views
1

фонаSpring Ботинки: Embedded Tomcat с помощью RewriteValve

Я использую Spring бутс 1.4 в простом приложении Java. В качестве эксперимента я решил написать свой собственный servletContainer() bean, чтобы ввести Tomcat's RewriteValve в контейнер. Этот клапан добавляется как глобальный контекстный клапан и должен применяться ко всем запросам.

Я пользуюсь Tomcat 8.5.x.

Поскольку клапан ожидает, что конфигурация будет доступна в папке WEB-INF, мне удалось переопределить метод startInternal(), чтобы он мог прочитать файл rewrite.config в каталоге pathpath, который является контейнером/tomcat/rewrite.config.

Клапан считывает конфигурацию в порядке. Файл rewrite.config просто заявляет следующее правило:

^/app2.+ /app 

Значение, переписывать URL, чтобы быть/приложение, когда URL запроса начинается с/app2.

Важно отметить, что само приложение развертывается под/app, а не под ROOT. Это обрабатывается через свойство server.context-path.

Что не работает

Поскольку приложение развертывается в/приложение, клапан действительно никогда не вызывается, когда/запросы app2 представляются. Например:

  1. http://localhost:8080/app2 никогда не активирует клапана
  2. http://localhost:8080/app/app2 активирует клапан

Если удалить контекстный путь и развернуть/приложение под корнем, это то, что я могу наблюдать:

  1. http://localhost:8080/app2 активирует клапан

Что работает

Использование внешнего контейнера TOMCAT, если я вручную настроить клапан с теми же правилами, и развернуть приложение в/приложение, я могу наблюдать:

  1. http://localhost:8080/app2 активирует клапан правильно , Этот URL-адрес переиздан в http://localhost:8080/app

Что я могу сделать неправильно?

+0

я думаю, что снимки продукции будет более подходящим, как ваш локальный не видимый для другой машины – emotionlessbananas

+0

Существует мир различий с использованием встроенного tomcat и развертывания для автономного tomcat. Встроенный tomcat прослушивает * только * URL-адрес на контекстном пути (так что корень всего сервера изменяется!) в то время как автономный tomcat (без модификации) слушает '/' и отправляет правильное приложение на основе URL-адреса. Следовательно, результат того, что вы здесь описываете, в основном более или менее, как я ожидал бы. ваш собственный «servletContainer», который в основном предоставляет значение по умолчанию довольно бесполезно, добавьте свой код для получения дополнительной помощи. –

+0

То, что вы описали, имеет смысл. В моем servletContainer нет ничего, что достойно поделить на самом деле. Все, что он делает, создает новый экземпляр клапана, позволяет считывать конфигурационный файл и добавляет его в качестве контекстного клапана. Больше ничего. –

ответ

0

Вы сделали ошибку в регулярном выражении, используемом для описания правила перезаписи

^/app2.+ /app 

«. +» часть означает любой символ, который occurres один или несколько раз, но там должны быть по крайней мере, один символ после строки app2. Я думаю, что вы должны просто изменить его на «.* ", который подразумевает, что может быть символом после app2, но в то же время мы не ожидаем, что он будет там:

^/app2.* /app