Tomcat не добавляет конечную косую черту в контекст веб-приложения - программирование
Подтвердить что ты не робот

Tomcat не добавляет конечную косую черту в контекст веб-приложения

Я бы хотел, чтобы Tomcat автоматически добавлял конечную косую черту в контекст моего приложения, если URL-адрес введен без нее.

Когда я тестирую Jetty, он автоматически добавляет конечную косую черту в контекст приложения, но Tomcat этого не делает.

Я не знаю, как будет использоваться контекст после развертывания, поскольку я передаю WAR кому-то другому, поэтому любые ссылки на ресурсы в HTML являются относительными. Есть ли способ, чтобы Tomcat автоматически перенаправлялся в один и тот же контекст с добавлением косой черты?

В настоящее время используется Tomcat 7 с Spring 3.

4b9b3361

Ответ 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 и т.д.).

Ответ 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">