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


Автор: KostenkoSergey 27.12.2005, 15:35
как можно определить порт, на который пришёл запрос в теле init() - метода сервлета ?

Автор: Domestic Cat 27.12.2005, 16:06
Насколько я понимаю - никак. В доках сказано:
Цитата
The init method must complete successfully before the servlet can receive any requests.

Проще говоря, сначала создается инстанс сервлета, затем вызывается init, после чего сервлет способен обрабатывать реквесты.
Из ServletRequest объекта порт можно получить в методах, где он обрабатывается, в том же service:
http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletRequest.html#getServerPort()

Автор: KostenkoSergey 27.12.2005, 16:27
Цитата(Domestic @ 27.12.2005, 16:06)
асколько я понимаю - никак

... вот я такое нарыл - а хотелось бы smile

Автор: COVD 27.12.2005, 18:13
А зачем определять? Есть порт, на котором слушает контейнер сервлетов (Томкат, например), и это обычно порт 80 или 8080. Сервлет не работает с портом, реквесты ему передает контейнер сервлетов и ему же он возвращает респонс.

Автор: KostenkoSergey 27.12.2005, 19:08
у меня на одном хосте запущено два контейнера - в методе инит происходит считывание из файла адреса, куда редеректить запрос дальше (локалхост:8080 - например).
вот собсно ...

Автор: COVD 27.12.2005, 19:34
У сервлета есть методы doPost и doGet, в которые контейнер передает обьекты реквеста и респонса.
Первый обьект(реквест) - это труба, из которой в сервлет поступают параметры запроса.
Второй обьект(респонс) - труба, в которую сервлет должен выбросить свой ответ. Сервлет -это как статический метод.
Таким образом, кто прислал запрос , тот и получит ответ. Это ответственность контейнера вернуть ответ автору запроса.

Автор: KostenkoSergey 27.12.2005, 19:58
я вкурсе smile))) мне важно куды именно будет редиректиться а не кто вернёт ... но то уже офтопик

Автор: 3,14 28.12.2005, 10:18
Вобще-то всё просто:

Код

int port = request.getServerPort();

Автор: Domestic Cat 28.12.2005, 11:23
Цитата(3)
int port = request.getServerPort();

Это в теле init метода?

Автор: 3,14 28.12.2005, 13:20
Цитата(Domestic @ 28.12.2005, 11:23)
Это в теле init метода?

Извиняюсь, не обратил внимание что нужно именно в init-е это сделать...

Автор: 3,14 28.12.2005, 13:33
Цитата(KostenkoSergey @ 27.12.2005, 15:35)
как можно определить порт, на который пришёл запрос в теле init() - метода сервлета ?

Тогда вопрос не корректный, в init не могут приходить запросы

Автор: KostenkoSergey 28.12.2005, 16:30
Цитата(3)
Тогда вопрос не корректный

- нет, ну Вы посмотрите на него smile))))

Вопрос ему некоректный..... - 3 поста "в тему" сделал... smile

Инит вызывается перед перевым обращением к ДО_*... после обращения к сервлету.

Автор: Domestic Cat 28.12.2005, 16:33
Модератор: Не оффтопить

Вопрос действительно некорректный.

Автор: alexsmirnov 30.12.2005, 18:01
Вобще-то, когда и сколько раз вызывается init() - это забота контейнера. Обычно создается pool instance сервлетов, Tomcat 5.5.12 это делает вообще при старте приложения, до каких-либо запросов. И далее из этого пула выбираются экземпляры для обработки. Поэтому, init() может вызваться раз 5 ( или как настроен контейнер ) до каких-либо запросов, если сервер перегружен - по мере поступления запросов пул может расширяться ( и опять будет вызываться init() ). А инициализированный сервлет обрабатывает МНОГО запросов - который из них тебе нужен ? Первый ? Сотый ? Миллионный ?

Автор: chief39 3.1.2006, 12:34
Я так понимаю, вопрос в том, предоставляет ли сервер какое-то АПИ для считывания своих настроек.

Цитата(alexsmirnov @ 30.12.2005, 18:01)
который из них тебе нужен ? Первый ? Сотый ? Миллионный ?

Насколько мне понятна суть проблемы - это не имеет значения - конфигурация сервера всё равно одна. И если уточним порт при каждой инициализации нового сервлета - невелика беда.

Вот только... можно ли это узнать? Каким-то документированным или недокументированным способом?
Вроде бы всё катится к тому, что "нет" smile

Автор: alexsmirnov 7.1.2006, 23:48
Естественно, нет. Поскольку запросы на разные порты могут обрабатываться одним сервлетом. Для которого init() вызывается один раз.

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