Подтвердить что ты не робот

Разница между getLocalPort() и getServerPort() в сервлетах

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

Посмотрим, что говорит javadoc о getLocalPort():

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

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

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

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

Ответ 3

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

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

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