Я хотел бы знать, если есть чистый способ получить запрос, на который отвечает webapp, чье имя не отображается в URL-адресе запроса. В некотором роде URL должен быть псевдонимом webapp. Кроме того, псевдоним не должен быть статичным или фиксированным с помощью одного единственного веб-приложения, но мне нужно иметь возможность легко менять webapp за псевдонимом для увеличения версии. То, что приходит мне в голову, это
Обе идеи не приводят к желаемому результату. Я хотел бы иметь более легкое решение.
Это возможно?
Благодаря сообщению от Александра я нашел правильный трек, но я использовал дополнительную работу, которая является более или менее фасадным webapp, упомянутым в пункте 1) из моего первоначального вопроса. Я покажу весь свой подход для всех желающих:
Во-первых, у меня есть все мои стандартные веб-приложения, развернутые в /tomcat/webapps
с одним стандартным режимом context.xml
и autoDeploy
. Чтобы поймать все остальные запросы, которые не соответствуют одному из развернутых контекстов, я настроил новый webapp, который действует как веб-приложение по умолчанию для несоответствующих запросов. Позвольте называть его dispatcher-app
.
Чтобы сделать это, я должен установить его как ROOT
. Чтобы развернуть его под своим первоначальным именем, я /tomcat/webapps2
его под /tomcat/webapps2
и связанным с ним context.xml
в /tomcat/conf/Catalina/localhost/ROOT.xml
. Для предотвращения двойного развертывания в tomcat необходимо включить его вне /webapps
с режимом autoDeploy, используемым для других webapps. Дополнительную информацию об этом можно найти здесь: http://tomcat.apache.org/tomcat-7.0-doc/config/context#Naming
ROOT.xml
выглядит так:
<Context
path=""
docBase="/path/to/tomcat-base/webapps2/dispatcher-app"
crossContext="true"
/>
В web.xml dispatcher-app
убедитесь, что он использует
<servlet-mapping>
<url-pattern>/</url-pattern>
</servlet-mapping>
dispatcher-app
внутри ищет исходный путь, запрошенный пользователем с помощью uriInfo.getAbsolutePath()
. Затем он сопоставляет приложение с URL-адресами с приложениями, которые запускаются в tomcat, известными из пользовательского файла конфигурации. Если есть совпадение, файл конфигурации знает, к какому приложению следует сделать переадресацию. Например, пользователь запрашивает myserver/webapp-1/test?param=value
и перенаправляется на myserver/webapp-1.1.2/test?param=value
. Webapp to forward to может быть обновлен в файле конфигурации вручную, если версия приложения изменится.
Фактический вперед должен быть сделан с использованием
RequestDispatcher dispatcher=servletContext.getRequestDispatcher(redirectTo);
dispatcher.forward(request, response);
потому что прямой не будет видимым для пользователя.
Поскольку я не мог выполнить этот запуск (см. Пересылку запроса перекрестного контекста в tomcat, результат в java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger), я просто использовал перенаправление 307 на данный момент.
return Response.status(307).location(new URI(redirectTo)).build();
Недостатком этого является то, что браузер отобразит URL-адрес переадресации в адресной строке.
UPDATE: RequestDispatcher
работает сейчас, только не для этого особого случая /webapp, упомянутого выше. Поэтому я предпочитаю этот подход по переадресации.
Следует отметить, что аутентификация на основе контейнеров (например, realm
) на втором веб-папе не будет эффективной (так как мы выполняем форвард "сзади"), так что dispatcher-app
нуждается в самом методе аутентификации, или аутентификация должна быть с другим механизмом, таким как RequestFilter
.
Если вы хотите сделать это только с помощью tomcat, вы можете статически сопоставить свой путь webapp в tomcat context.xml
определяющий контекст и отображающий request path
("путь") к директории webapp dir
("docBase").
Просто добавьте это в свой <tomcatDir>/conf/context.xml
:
<Context
path=""
docBase="/<pathToYourWebapp>/<yourApp>"
/>
Это имеет побочный эффект, что вы можете иметь только один webapp, конечно, потому что каждый запрос und /
отображается на ваш webapp.
Для получения дополнительной информации см. Http://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Common_Attributes.
<Context/>
в context.xml ( conf/context.xml
), это будет один узел на веб-приложение в одном и том же context.xml . Я думаю, что вы также можете добавить один context.xml для каждого веб-приложения в conf/Catalina/localhost/<webappName>
, но это другая история. @Affe предложил другой способ («... устройство балансировки нагрузки или apache / nginx») - без настройки tomcat, но с настройкой чего-либо до