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

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

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

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

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

5 ответов

Решение

Это старый пост, но начиная с Tomcat 7.0.67, вам нужно добавить следующий атрибут в ваш файл context.xml:

<Context mapperContextRootRedirectEnabled="true">...</Context>

Согласно журналу изменений7.0.67:

Переместите функциональность, которая обеспечивает перенаправления для корней контекста и каталогов, где конечный / добавлен из Mapper в DefaultServlet. Это позволяет обрабатывать такие запросы любыми настроенными клапанами и фильтрами перед перенаправлением. Это поведение настраивается с помощью атрибутов контекста mapperContextRootRedirectEnabled и mapperDirectoryRedirectEnabled, которые можно использовать для восстановления предыдущего поведения.

И в контекстной документации Tomcat:

mapperContextRootRedirectEnabled: если этот параметр включен, запросы на корневой каталог контекста веб-приложения будут перенаправляться (с добавлением завершающей косой черты), если это необходимо, Mapper, а не сервлетом по умолчанию. Это более эффективно, но имеет побочный эффект подтверждения того, что контекстный путь существует. Если не указан, используется значение по умолчанию false.

Кажется, что web.xml вашего приложения имеет отображение "/*", Сервлет-отображение на "/*" заставляет tomcat передать запрос как есть веб-приложению (т.е. не перенаправляет).

Для правильного перенаправления необходимо изменить "/*" отображение просто "/"последний означает сервлет по умолчанию.

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

Если - из-за какой-то особой конфигурации - это не так, я бы написал Фильтр, который проверяет строку запроса и перенаправляет по мере необходимости приложения. Во многих случаях это необходимо в любом случае (выполнение перенаправлений http->https и т. Д.)

Вы пробовали поиграть с URL Rewrite на Tomcat?
Это может помочь: http://code.google.com/p/urlrewritefilter/

Если это не поможет, взгляните на это: перезапись URL в tomcat web.xml

Прекрасный ответ Пэт помог мне выкопать еще несколько деталей по этому поводу. Кажется, это связано с некоторыми причудами в некоторых версиях Tomcat (Tomcat 7 в 7.0.67+ и Tomcat 8 между 8.29 и 8.37), связанных с файлами cookie сеанса и перенаправлением URL-адреса.

Суть в том, что если java-сервер создает файлы cookie сеанса для конкретного пути с косой чертой в конце (например, "/app_name/"), то сервер также должен выполнить автоматическое первоначальное перенаправление (/app_name -> /app_name). /) ... в противном случае файл cookie сеанса не будет отправлен вместе с запросом, и он никогда не будет выглядеть на сервере, как будто у вас есть действительный сеанс. Это может привести к петле перенаправления от приложения к аутентификации.

В Tomcat есть конфигурации, которые контролируют оба поведения, но, насколько я могу судить, в этих версиях они были по существу несинхронизированы, так что можно получить cookie с завершающим слешем без перенаправления. В журнале изменений Tomcat есть несколько связанных с этим проблем / изменений: https://tomcat.apache.org/tomcat-8.0-doc/changelog.html

Как уже заметил Пат, это решается добавлением этого атрибута в элемент Context вашего приложения:

<Context mapperContextRootRedirectEnabled="true">
Другие вопросы по тегам