Tomcat: Программно изменить виртуальные хосты?

Tomcat предлагает встроенную поддержку "Виртуального хостинга": Engine/Web-приложение может быть настроено на то, чтобы отвечать за список доменов. Эти Домены должны быть помещены в файлы server.xml/context.xml со специальной директивой xml.

= > Есть ли какая-либо возможность программно изменить конфигурацию Tomcat (в общем) и особенно "виртуальные хосты" веб-приложения/двигателя?

Например, если новый пользователь подписывается, я должен добавить его домен в список "принятых виртуальных хостов/доменов". Единственный способ, который я сейчас рассматриваю, - это изменить файлы xml с помощью script, а затем перезапустить Tomcat.

Есть ли какой-нибудь способ добавить их в программную реализацию через некоторые Java-методы?

Большое спасибо! Ян

Ответ 1

Tomcat предоставляет API для создания нового виртуального хоста. Чтобы получить доступ к оберточному объекту, который необходим для этого, вам необходимо реализовать ContainerServlet. Вы можете создать виртуальный хост таким образом,

    Context context = (Context) wrapper.getParent();
    Host currentHost = (Host) context.getParent();
    Engine engine = (Engine) currentHost.getParent();

    StandardHost host = new StandardHost();
    host.setAppBase(appBase);
    host.setName(domainName);

    engine.addChild(host);

Вам нужно убедиться, что каталог appBase существует, и вам нужно найти способы сохранения нового хоста server.xml или вы потеряете хост при перезагрузке.

Однако этот подход редко срабатывает. Если ваши пользователи запускают свои собственные приложения, вам действительно нужно запускать отдельные экземпляры Tomcat, чтобы вы могли лучше использовать приложения для песочницы. например В одном приложении, не использующем память, не уничтожаются все другие приложения.

Если вы предоставляете приложение, вы можете просто использовать один хост (defaultHost). Вы можете получить имя домена из заголовка Host и делать все, что связано с доменом, в вашем коде.

Ответ 2

Вы не должны изменять программную среду сервера, и нет надежных и стандартных способов сделать это. Лучше всего делать и хранить все это на стороне webapp. Для начала, a Filter отлично подходит для этого. Храните имена где-нибудь в таблице базы данных или файл свойств, который вы кешируете в области приложения. Проверьте HttpServletRequest#getRequestURI() (или getServerName(), если это поддомен вместо pathinfo) и выполните задачу переадресации.

Надеюсь, что это поможет.

Ответ 3

Использовать JMX

ArrayList serverList = MBeanServerFactory.findMBeanServer(null);
MBeanServer server = (MBeanServer) serverList.get(0);
Object[] params = { "org.apache.catalina.core.StandardHost", hostName };
String[] signature = { "java.lang.String", "java.lang.String" };
server.invoke(new ObjectName("Catalina:type=Engine"), "addChild", params, signature);

При необходимости загрузите объект-хост и выполните с ним работу:

ObjectName host = new ObjectName("Catalina:type=Host,host=" + hostName);
server.setAttribute(host, new Attribute("autoDeploy", false));
server.invoke(host, "start", null, null);

Ответ 4

Я предлагаю вам установить ваше приложение как виртуальный хост по умолчанию в server.xml, чтобы ваш единственный виртуальный хост мог отвечать на запросы, адресованные любому имени хоста. Tomcat поставляется с локальным приложением, установленным как виртуальный хост по умолчанию. Таким образом, вы можете увидеть, как это сделать, просто проверив файл server.xml установки vanilla tomcat. Вы можете программно определить имя хоста, которому пользователь отправил запрос, используя метод ServletRequest.getServerName().

Tomcat использовался для отправки с помощью веб-приложения под названием "host-manager". Примечание: это отличается от веб-приложения "manager", которое все еще поставляется с Tomcat. Хост-менеджер разрешил изменять конфигурацию или добавлять новые виртуальные хосты на лету без перезапуска сервера. Вы можете взаимодействовать с хост-менеджером через HTTP (программно, если это необходимо). Тем не менее, у него был неудачный недостаток не вносить свои изменения в server.xml, чтобы они были потеряны при перезапуске веб-сервера. По какой-то причине, начиная с версии 6, Tomcat больше не поставляется с приложением хост-менеджера. Поэтому он больше не поддерживается.