Я изучаю сервлеты, у меня возникла разница между getLocalPort()
и getServerPort()
.
Здесь getLocalPort()
означает серверную сторону только тогда, что означает значение getServerPort()
?
Спасибо.
Я изучаю сервлеты, у меня возникла разница между getLocalPort()
и getServerPort()
.
Здесь getLocalPort()
означает серверную сторону только тогда, что означает значение getServerPort()
?
Спасибо.
В простой настройке (где ваш сервер приложений/сервлетов принимает запрос клиента напрямую) оба метода вернут одно и то же значение.
Когда контейнер сервлетов не является приложением, которое принимает запрос клиента (например, когда вы используете HTTP-сервер Apache с mod_jk, чтобы принять запрос и перенаправить запрос экземпляру Tomcat через AJP), тогда getServerPort()
вернет порт, к которому подключен клиент (возможно, 80, когда используется порт по умолчанию) и getLocalPort()
вернет порт, который Tomcat использовал для приема соединения с HTTP-сервера (возможно, 8009 или что-то подобное).
Посмотрим, что говорит javadoc о getLocalPort()
:
Возвращает номер порта интернет-протокола (IP) интерфейса, на который был получен запрос.
И вот что мы можем прочитать о getServerPort()
:
Возвращает номер порта, на который был отправлен запрос. Это значение части после ":" в значении заголовка хоста, если таковое имеется, или на сервере, на котором было принято соединение с клиентом.
Итак, если клиент отправляет запрос http://mydomain.com:80/, который затем "маршрутизируется" в контейнер, прослушивающий другой порт (и, возможно, другой машины), getServerPort()
вернется 80
, а getLocalPort()
вернет порт контейнера, в который был отправлен запрос, скажем 7001
для экземпляра WebLogic, который прослушивает этот порт.
Я посмотрел на реализацию портвейна Jetty и Tomcat, и это мои выводы:
Следовательно, getServerPort() не имеет ничего общего с HTTP-сервером apache или балансировщиком нагрузки, сидящим перед ним (если есть), или маршрутами IP-таблицы, сидящими на сервере Tomcat/Jetty. Они всегда будут возвращать стандартный номер порта на основе http/https, если номер порта не указан в URL-адресе запроса.