servlet中getLocalPort()和getServerPort()之间的区别

时间:2010-02-02 13:23:39

标签: java servlets

我正在研究servlet,我在getLocalPort()getServerPort()之间产生了疑问。 这里getLocalPort()表示服务器端只有getServerPort()的含义?

感谢。

3 个答案:

答案 0 :(得分:25)

在一个简单的设置中(您的应用程序服务器/ servlet容器直接接受客户端的请求),两个方法都将返回相同的值。

当servlet容器不是接受客户端请求的应用程序时(例如,当您使用带有mod_jk的Apache HTTP服务器接受请求并通过AJP将请求转发到Tomcat实例时),getServerPort()将返回客户端连接的端口(可能是80,当使用默认端口时),getLocalPort()将返回Tomcat用于接受来自HTTP服务器的连接的端口(可能是8009或类似的东西)。

答案 1 :(得分:8)

让我们看看javadoc对getLocalPort()的评价:

  

返回接收请求的接口的Internet协议(IP)端口号。

这是我们可以阅读的getServerPort()

  

返回发送请求的端口号。它是Host头值中的“:”之后的部分的值(如果有),或者是接受客户端连接的服务器端口。

因此,如果客户端向http://mydomain.com:80/发送请求,然后将其“路由”到侦听另一个端口(可能是另一台计算机)的容器,getServerPort()将返回80并且getLocalPort()将返回转发请求的容器的端口,对于侦听该端口的WebLogic实例,请说7001

答案 2 :(得分:1)

我查看了Jetty和Tomcat的服务器端口实现,这是我的发现:

  1. 当请求URL中包含端口号时(例如http(s):// website.com:8888 / blah / blah-blah),getServerPort()始终返回请求URL中包含的内容(在例如,8888)
  2. 当请求URL中没有端口号时,则
    • 443将被退回
      • Tomcat看到SSLEnabled = true
      • Jetty看到schema = https
    • 如果是,
    • 80将被退回
      • 看到SSLEnabled = false
      • Jetty看到schema = http
  3. 因此,getServerPort()与位于其前面的apache HTTP服务器或负载均衡器(如果有)或位于Tomcat / Jetty服务器上的IP表路由无关。除非在请求URL中指定了端口号,否则它们将始终返回基于http / https的标准端口号。