2010-02-02 33 views

回答

19

在一個簡單的設置中(您的應用程序服務器/ servlet容器直接接受客戶端的請求),兩種方法都會返回相同的值。

當servlet容器不是接受客戶端請求的應用程序時(例如,當您使用帶有mod_jk的Apache HTTP服務器接受請求並通過AJP將請求轉發給Tomcat實例時),那麼getServerPort()將返回端口連接到的客戶端(可能是80,當使用默認端口時)和getLocalPort()將返回Tomcat用來接受來自HTTP服務器(可能是8009或類似的)的連接的端口。

6

讓我們來看看javadoc的是怎麼說getLocalPort()

返回在其收到請求接口的互聯網協議(IP)端口號。

這是我們能讀到getServerPort()

返回到發送請求的端口號。它是Host頭部值(如果有)中的「:」之後的部分值,或者客戶端連接被接受的服務器端口。

所以,如果一個客戶端發送到http://mydomain.com:80/的請求是那麼「全軍覆沒」到另一個端口上的容器聽力(也許另一臺機器),getServerPort()將返回80getLocalPort()將容器口返回請求被轉發的請求,例如7001,以獲取偵聽該端口的WebLogic實例。

+1

當我第一次看到這個問題時,我閱讀了API,直到我看到Joachim的回答(我以此爲生)之前,它並沒有立即明白我的區別。所以我認爲原始的海報(誰在「學習servlets」)與差異化鬥爭是相當合理的。 –

+1

@Jack絕對的,我只粘貼了API文檔作爲參考(以及主機頭文件)。 –

1

我看着Jetty和Tomcat的實現的服務器端口的,這是我的發現:

  1. 當請求URL中有一個端口號(例如HTTP(S)://網站。com:8888/blah/blah-blah),getServerPort()總是返回請求URL中包含的內容(例如,8888)
  2. 當請求URL中沒有端口號時,則
      如果
      • 的Tomcat看到SSLEnabled =真
      • 443將返回
      • 碼頭看到模式= HTTPS
    • 80將被退回,如果
      • 看到SSLEnabled =假
      • 碼頭看到模式= HTTP

因此,getServerPort()無關,與Apache HTTP服務器或負載均衡坐在它前面(如果任何),或者坐在Tomcat/Jetty服務器上的IP表路由。除非請求URL中指定了端口號,否則它們將始終返回基於http/https的標準端口號。