Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > ServletContextListener


Автор: twin84 28.9.2006, 14:52
Есть ServletContextListener. 

Можно ли и, если можно, то как в нем получить имя хоста? 
Т.е. если к сервлету будут идти обращения типа:

http://aaa.bbb.ccc/ddd

получить aaa.bbb.ccc ???

Автор: Stampede 28.9.2006, 19:10
Цитата(twin84 @  28.9.2006,  05:52 Найти цитируемый пост)
Можно ли и, если можно, то как в нем получить имя хоста?


Похоже что нельзя. По крайней мере судя по докам из Servlet API. И этому есть хорошая причина. Дело в том, что один и тот же ресурс может быть доступен через разные домены. Классический пример: если у нас есть есть сайт с доменным именем puplin.com, мы можем захотеть, чтобы к нему можно было также обратиться через www.pupkin.com (почему - это отдельный вопрос).

Для этой цели разные контейнеры предусматриваеют возможность прописания алиаса(ов) в том или ином виде. Например, в Томкате это будет выглядеть так:

Код

<Host name="pupkin.com"  appBase="webapps" reloadable="false">
    <Alias>www.pupkin.com</Alias>
    <Alias>vasya-pupkin.com</Alias>
</Host>


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

Цитата
Кстати, предупреждаю: метод request.getLocalName(), который по идее должен возвращать имя хоста, по которому произошло обращение, в Томкате работает неправильно


Блин, минутное затмение нашло. Конечно, метод getServerName() (kkorsakoff, спасибо за поправку). А проблемы c ним действительно возникали в каких-то нештатных ситуациях (уж не помню, в каких версиях). И самым надежным средством получить именно то имя хоста, которое шло из браузера - было смотреть на заголовок Host: request.getHeader("Host");

Автор: kkorsakoff 28.9.2006, 20:17
Всмысле getServerName()?
Хм....всегда работал нормально, выдавал имя хоста.

А через ServletContext достать им хоста невозможно именно по причинам, которые указал Stampede.
Но если очень надо и сервер - Tomcat, можно поиграть с MBeans. Можно получить конфиг Host'a и оттуда взять домен и все альясы.

Автор: y3u 28.9.2006, 23:15
 smile хотя бы для том кета! А есть какое-нибудь контенеронезависимое решение? К примеру для JBoss, у которого вебконтейнерами могут быть много кто, тот же том кет, джетти и т.д....

Автор: batigoal 29.9.2006, 12:06
Может, стоит просто запихать имя домена в параметры инициализации? Оно ведь навряд ли будет часто меняться.

Автор: Stampede 29.9.2006, 14:34
Цитата(batigoal @  29.9.2006,  03:06 Найти цитируемый пост)
Может, стоит просто запихать имя домена в параметры инициализации? Оно ведь навряд ли будет часто меняться.


А что, резонно. Я бы наверно так и сделал. Ну или не в параметрах, а в собственном конфиге.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)