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