Java servlet中getLocalPort()和getServerPort()之间的差异
我正在研究servlet,我发现Java servlet中getLocalPort()和getServerPort()之间的差异,java,servlets,Java,Servlets,我正在研究servlet,我发现getLocalPort()和getServerPort()之间有一个明显的区别。 这里的getLocalPort()仅表示服务器端,那么getServerPort()的含义是什么 谢谢。在一个简单的设置中(您的应用程序服务器/servlet容器直接接受客户机的请求),两个方法将返回相同的值 当servlet容器不是接受客户机请求的应用程序时(例如,当您使用带有mod_jk的Apache HTTP服务器来接受请求并通过AJP将请求转发给Tomcat实例时),则将返
getLocalPort()
和getServerPort()
之间有一个明显的区别。
这里的getLocalPort()
仅表示服务器端,那么getServerPort()
的含义是什么
谢谢。在一个简单的设置中(您的应用程序服务器/servlet容器直接接受客户机的请求),两个方法将返回相同的值
当servlet容器不是接受客户机请求的应用程序时(例如,当您使用带有mod_jk的Apache HTTP服务器来接受请求并通过AJP将请求转发给Tomcat实例时),则将返回客户机连接到的端口(当使用默认端口时,可能为80)并将返回Tomcat用来接受HTTP服务器连接的端口(可能是8009或类似的端口)。让我们看看javadoc是怎么说的: 返回接收请求的接口的Internet协议(IP)端口号 这就是我们可以读到的: 返回请求发送到的端口号。它是主机头值(如果有)中“:”之后的部分的值,或者是在其上接受客户端连接的服务器端口
因此,如果客户机向另一个端口(可能还有另一台机器)发送请求,然后“路由”到侦听另一个端口的容器,
getServerPort()
将返回80
,getLocalPort()
将返回请求转发到的容器的端口,让我们假设7001
用于侦听该端口的WebLogic实例 我研究了Jetty和Tomcat对服务器端口的实现,以下是我的发现:
- 443将被退回,如果
- Tomcat看到SSLEnabled=true
- Jetty sees schema=https
- 如有需要,将退还80美元
- sees SSLEnabled=false
- Jetty sees schema=http
因此,getServerPort()与前面的ApacheHTTP服务器或负载平衡器(如果有)或Tomcat/Jetty服务器上的IP表路由无关。他们总是返回基于http/https的标准端口号,除非在请求URL中指定了端口号。我第一次读这个问题时读过API,直到看到Joachim的答案(我是靠这个为生)我才立即意识到区别是什么。因此,我认为原始海报(正在研究servlet)与差异作斗争是非常合理的。@Jack绝对正确,我只粘贴了API文档作为参考(以及主机标题)。回答得很好!非常适用于负载平衡环境。