2009-11-13 5 views
10

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

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

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

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

спасибо! Jan

ответ

6

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

+1

Привет, ZZ Coder, спасибо за ваш ответ. Thats vey интересно, никогда не слышал об этом, это блестяще знать, что есть способы получить доступ к Host и Engine в Tomcat. – jan

+0

@Coder, как получить объект 'wrapper' – Kainix

+0

@Kainix Вам нужно создать сервлет, реализующий ContainerServlet, у которого есть setter setWrapper(). Tomcat вызовет ваш сеттер для установки обертки. Я не использовал это с Tomcat 5, поэтому механизм, возможно, изменился. –

1

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

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

+0

Здравствуйте Асафа, спасибо большое за ответ! – jan

3

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

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

+0

Здравствуйте, BalusC, большое спасибо за ваш ответ! – jan

+0

Я думаю, что это лучший способ сделать это. Почему требуется отображение db. Можем ли мы не просто сопоставить веб-приложение с поддоменом? – Sorter

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); 
+0

Спасибо за сообщение! Пожалуйста, не используйте подписи/метки в своих сообщениях. Ваш ящик пользователя считается вашей подписью, и вы можете использовать свой профиль для публикации любой информации о себе, как вам нравится. [Часто задаваемые вопросы о подписках/тегах] (http://stackoverflow.com/faq#signatures) –

 Смежные вопросы

  • Нет связанных вопросов^_^