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

我正在研究servlet,我已经想出了getLocalPort()getServerPort()之间的区别。 这里的getLocalPort()意味着服务器端只有那么getServerPort()的含义是什么?

谢谢。

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

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

让我们看一下javadoc对getLocalPort()看法:

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

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

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

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

我查看了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

因此,getServerPort()与位于其前面的apache HTTP服务器或负载均衡器(如果有)或位于Tomcat / Jetty服务器上的IP表路由无关。 除非在请求URL中指定了端口号,否则它们将始终返回基于http / https的标准端口号。