Обработка ссылок на контекстный путь при переносе сайта “/” в Java EE packaging
-
02-07-2019 - |
Вопрос
Существующий Java-сайт предназначен для запуска под управлением "/" на tomcat, и есть много конкретных ссылок на фиксированные абсолютные пути, такие как "/dir /dir/page".
Хотите перенести это в Java EE packaging, где сайт должен будет запускаться под контекстным корнем, например"/dir/dir/page" становится "/my-context-root/dir/dir/страница".
Теперь контекстный корень можно легко получить с помощью ServletRequest.getContextPath(), но это по-прежнему означает множество изменений кода для переноса большой базы кода.Большинство этих ссылок представлены в буквальном формате HTML.
Я экспериментировал с использованием фильтров сервлетов для перезаписи в oubound HTML, и, похоже, это работает нормально.Но это влечет за собой некоторые накладные расходы, и я бы не рассматривал это как постоянное решение.(см . EnforceContextRootFilter-1.0-src.zip для подхода с фильтром сервлетов).
Есть ли какие-то лучшие подходы к решению этой проблемы?Я упускаю что-нибудь очевидное?Все комментарии приветствуются!
Решение
Ознакомьтесь с соответствующим вопрос
Также рассмотрите UrlRewriteFilter Фильтр UrlRewriteFilter
И еще одно (я продолжаю редактировать этот чертов пост).Если вы используете JSP (в отличие от статического HTML или чего-то еще), вы также можете создать файл тегов, чтобы заменить обычные html-теги ссылками (в частности, a, img, form).Таким образом, <a href="/root/path">ссылка</a> может стать <t:a href="/root/path">Ссылка</t:a>.Затем тег может выполнить перевод за вас.
Это изменение можно легко внести "в массовом порядке", используя что-то вроде sed.
sed -e 's/<a/<t:a/g' -e 's/<\/a>/<\/t:a>/g' old/x.jsp > new/x.jsp
Действия с формой могут быть немного сложнее, чем sed, но вы поняли идею.
Другие советы
мир apache использовал перенаправления (mod_rewrite), чтобы сделать то же самое.
Мир сервлетов начал использовать фильтры
Ruby world (или RoR) делает больше того же самого, и они называют это маршрутизацией.
Таким образом, обойти это невозможно (если только вы не хотите использовать smart regex через out - что было опробовано, и оно работает просто отлично).