фона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 представляются. Например:
- http://localhost:8080/app2 никогда не активирует клапана
- http://localhost:8080/app/app2 активирует клапан
Если удалить контекстный путь и развернуть/приложение под корнем, это то, что я могу наблюдать:
- http://localhost:8080/app2 активирует клапан
Что работает
Использование внешнего контейнера TOMCAT, если я вручную настроить клапан с теми же правилами, и развернуть приложение в/приложение, я могу наблюдать:
- http://localhost:8080/app2 активирует клапан правильно , Этот URL-адрес переиздан в http://localhost:8080/app
Что я могу сделать неправильно?
я думаю, что снимки продукции будет более подходящим, как ваш локальный не видимый для другой машины – emotionlessbananas
Существует мир различий с использованием встроенного tomcat и развертывания для автономного tomcat. Встроенный tomcat прослушивает * только * URL-адрес на контекстном пути (так что корень всего сервера изменяется!) в то время как автономный tomcat (без модификации) слушает '/' и отправляет правильное приложение на основе URL-адреса. Следовательно, результат того, что вы здесь описываете, в основном более или менее, как я ожидал бы. ваш собственный «servletContainer», который в основном предоставляет значение по умолчанию довольно бесполезно, добавьте свой код для получения дополнительной помощи. –
То, что вы описали, имеет смысл. В моем servletContainer нет ничего, что достойно поделить на самом деле. Все, что он делает, создает новый экземпляр клапана, позволяет считывать конфигурационный файл и добавляет его в качестве контекстного клапана. Больше ничего. –