Tomcat: Изменить виртуальные хосты программно? - PullRequest
10 голосов
/ 13 ноября 2009

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

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

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

Можно ли как-нибудь добавить их во время выполнения с помощью некоторых Java-методов программно?

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

Ответы [ 4 ]

6 голосов
/ 13 ноября 2009

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 и делать все, что связано с доменом, в вашем коде.

3 голосов
/ 27 февраля 2013

Используйте 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);
3 голосов
/ 13 ноября 2009

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

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

1 голос
/ 13 ноября 2009

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

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

...