Tomcat не добавляет конечную косую черту в контекст веб-приложения
Я бы хотел, чтобы Tomcat автоматически добавлял конечную косую черту в контекст моего приложения, если URL-адрес введен без нее.
Когда я тестирую Jetty, он автоматически добавляет конечную косую черту в контекст приложения, но Tomcat этого не делает.
Я не знаю, как будет использоваться контекст после развертывания, поскольку я передаю WAR кому-то другому, поэтому любые ссылки на ресурсы в HTML являются относительными. Есть ли способ, чтобы Tomcat автоматически перенаправлялся в один и тот же контекст с добавлением косой черты?
В настоящее время используется Tomcat 7 с Spring 3.
Ответы
Ответ 1
Это старое сообщение, но с Tomcat 7.0.67 вам нужно добавить следующий атрибут в ваш файл context.xml:
<Context mapperContextRootRedirectEnabled="true">...</Context>
В соответствии с 7.0.67 changelog:
Переместите функциональность, предоставляющую перенаправления для корней и каталогов контекста, где трейлинг/добавлен из Mapper в DefaultServlet. Это позволяет обрабатывать такие запросы любыми сконфигурированными клапанами и фильтрами до того, как будет выполнена перенаправление. Такое поведение настраивается с помощью атрибутов mapperContextRootRedirectEnabled и mapperDirectoryRedirectEnabled контекста, которые могут быть использованы для восстановления предыдущего поведения.
И в контексте Tomcat документация:
mapperContextRootRedirectEnabled: если включено, запросы для корня контекста веб-приложения будут перенаправлены (добавление конечной косой черты), если необходимо, Mapper, а не Servlet по умолчанию. Это более эффективно, но имеет побочный эффект подтверждения того, что путь контекста существует. Если не указано, используется значение false по умолчанию.
Ответ 2
Кажется, что ваше приложение web.xml имеет сопоставление с "/*"
. Передача сервлета на "/*"
заставляет tomcat передавать запрос как есть в веб-приложение (т.е. Не перенаправляет).
Чтобы правильно перенаправить, вы должны изменить отображение "/*"
только на "/"
, последнее означает сервлет по умолчанию.
Ответ 3
Tomcat автоматически добавляет трейлинг-косую черту. Просто проверьте его с примером приложения, поставляемого с Tomcat..
Если - из-за некоторой специальной конфигурации - нет, я бы написал фильтр, который проверяет строку запроса и перенаправляет по мере необходимости приложение. В любом случае это необходимо в любом случае (переадресация http- > https и т.д.).
Ответ 4
Вы пытались сыграть с URL Rewrite на Tomcat?
Это может помочь: http://code.google.com/p/urlrewritefilter/
Если это не поможет, посмотрите на это: URL переписать в tomcat web.xml
Ответ 5
Отличный ответ Пэт помог мне разобрать еще несколько подробностей об этом. Похоже, что это связано с некоторыми причудами в некоторых версиях Tomcat (Tomcat 7 в 7.0.67+ и Tomcat 8 между 8.29 и 8.37), связанных с кукисами сеансов и перенаправлением URL.
Суть в том, что если java-сервер создает куки файлы сеанса, зависящие от конкретного пути, с косой чертой в конце (например, "/app_name/" ), тогда сервер также должен выполнять автоматическую первоначальную переадресацию (/app_name → /app_name/)... в противном случае cookie сеанса не будет отправлен с запросом, и он никогда не будет выглядеть на сервере, как у вас есть действительный сеанс. Это может привести к переадресации цикла из приложения к аутентификации.
В Tomcat есть конфигурации, которые контролируют оба поведения, но, насколько я могу судить, они были в основном не синхронизированы в этих версиях, так что можно было получить файл cookie с завершающим косой чертой, не получая перенаправление. В сводке изменений Tomcat есть несколько связанных с этим проблем/изменений:
https://tomcat.apache.org/tomcat-8.0-doc/changelog.html
Как уже отмечал Pat, это разрешено добавлением этого атрибута в элемент контекста приложения:
<Context mapperContextRootRedirectEnabled="true">