我目前有一个 Tomcat + Apache HTTP 服务器设置来为我的 Java servlet 提供服务:

ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice

这一切都很好,除了 myservice 需要知道客户端 IP 地址,由于代理的原因,该地址始终是 127.0.0.1。有没有办法获取真实IP地址?AJP 是一种选择吗?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
有帮助吗?

解决方案

像这样做:

在Apache的配置:

<Location /foo>
  ProxyPass ajp://localhost:8009/foo
  ProxyPassReverse ajp://localhost:8009/foo
</Location>

然后在你的server.xml:

<Connector port="8009" 
           enableLookups="false" secure="true" URIEncoding="UTF-8"
           tomcatAuthentication="false"
           protocol="AJP/1.3" />

这应该通过通过一切。的AJP协议传递信息,但HTTP:不

您可能不希望安全=“真”,我用的,因为SSL是在Apache层处理,我需要一个Tomcat知道该连接应被视为一个安全的。

其他提示

您可以在请求标头中读取 X-Forwarded-For。

来自 Apache mod_proxy 文档:

当以反向代理模式运行时(例如,使用 ProxyPass 指令),mod_proxy_http 添加几个请求标头,以便将信息传递到源服务器。这些标头是:

  • X-转发-For:客户端的IP地址。
  • X-转发主机:Host HTTP 请求头中客户端请求的原始主机。
  • X-转发服务器:代理服务器的主机名。

在源服务器上使用这些标头时要小心,因为如果原始请求已包含这些标头之一,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用 %{X-Forwarded-For}i 来记录原始客户端 IP 地址,但如果请求经过多个代理,您可能会获得多个地址。

在您的 servlet 中,您将拥有:

doGet(HttpServletRequest request, HttpServletResponse response){
  request.getHeader("X-Forwarded-For")
}

这是非常简单的:

<VirtualHost> 

 ServerName www.server.com

 redirect / http://www.server.com/foo

 ProxyRequests off
 ProxyPass / ajp://localhost:8009/

</VirtualHost>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top