Разница между getLocalPort () и getServerPort () в сервлетах - PullRequest
19 голосов
/ 02 февраля 2010

Я изучаю сервлеты, у меня возникла разница между getLocalPort() и getServerPort(). Здесь getLocalPort() означает серверную сторону только тогда, каково значение getServerPort()?

Спасибо.

Ответы [ 3 ]

25 голосов
/ 02 февраля 2010

В простой установке (когда ваш сервер приложений / контейнер сервлетов принимает запрос клиента напрямую) оба метода возвращают одно и то же значение.

Если контейнер сервлета не является приложением, принимающим запрос клиента (например, когда вы используете HTTP-сервер Apache с mod_jk для принятия запроса и пересылки запроса в экземпляр Tomcat через AJP), тогда getServerPort() вернет порт, к которому подключен клиент (вероятно, 80, если используется порт по умолчанию), а getLocalPort() вернет порт, который Tomcat использовал для приема соединения от HTTP-сервера (возможно, 8009 или что-то подобное).

8 голосов
/ 02 февраля 2010

Давайте посмотрим, что javadoc говорит о getLocalPort():

Возвращает номер порта протокола Интернета (IP) интерфейса, на котором был получен запрос.

И это то, что мы можем прочитать о getServerPort():

Возвращает номер порта, на который был отправлен запрос.Это значение части после «:» в значении заголовка узла, если оно есть, или порта сервера, на котором было принято клиентское соединение.

Итак, если клиент отправляет запрос наhttp://mydomain.com:80/, который затем «направляется» к контейнеру, прослушивающему другой порт (и, возможно, другую машину), getServerPort() вернет 80 и getLocalPort() вернет порт контейнера, к которому был отправлен запроснапример, переадресовано 7001 для экземпляра WebLogic, прослушивающего этот порт.

1 голос
/ 27 сентября 2017

Я посмотрел на реализацию Jetty и Tomcat серверного порта, и вот мои выводы:

  1. Если в URL запроса есть номер порта (например, http (s): //website.com: 8888 / blah / blah-blah), getServerPort () всегда возвращает то, что было включено в URL запроса (в Например, 8888)
  2. Если в URL запроса нет номера порта,
    • 443 будет возвращено, если
      • Tomcat видит SSLEnabled = true
      • Причал видит схему = https
    • 80 будет возвращено, если
      • видит SSLEnabled = false
      • Причал видит схему = http

Таким образом, getServerPort () не имеет ничего общего с HTTP-сервером Apache или балансировщиком нагрузки, расположенным перед ним (если есть), или маршрутами таблицы IP, расположенными на сервере Tomcat / Jetty. Они всегда будут возвращать стандартный номер порта на основе http / https, если только номер порта не указан в URL-адресе запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...