关于java web应用程序和X-REAL-IP头的问题

关于java web应用程序和X-REAL-IP头的问题,java,tomcat,nginx,Java,Tomcat,Nginx,我正在为一个客户设置一个项目的演示。在我的服务器上,我有许多使用不同技术构建的站点,它们在不同端口的不同服务器下运行。我使用nginx作为它们的反向代理。这个特定的应用程序是用java(SpringMVC/Blazeds)构建的,并将在Tomcat6下部署用于演示(可能也在生产中)。Nginx在用作反向代理时有一个很好的设置,使其能够在X-REAL-IP报头中传递原始请求的IP地址。我想做的是设置我的应用程序或至少tomcat,将X-REAL-IP头视为真正的请求IP地址。这可能吗?这取决于您所

我正在为一个客户设置一个项目的演示。在我的服务器上,我有许多使用不同技术构建的站点,它们在不同端口的不同服务器下运行。我使用nginx作为它们的反向代理。这个特定的应用程序是用java(SpringMVC/Blazeds)构建的,并将在Tomcat6下部署用于演示(可能也在生产中)。Nginx在用作反向代理时有一个很好的设置,使其能够在X-REAL-IP报头中传递原始请求的IP地址。我想做的是设置我的应用程序或至少tomcat,将X-REAL-IP头视为真正的请求IP地址。这可能吗?

这取决于您所说的“真正的请求IP”是什么意思。如果您谈论的是从
request.getRemoteAddr()
返回的值,那么是的,这是可能的。

实现这一点的方法是在web应用程序中设置一个servlet过滤器,该过滤器将截获所有URL(或仅截获您希望X-REAL-IP返回的URL),并将传入请求包装到
HttpServletRequestWrapper
的子代中,该子代将覆盖
getRemoteAddr()
返回X-REAL-IP值。

这取决于“REAL-request-IP”的含义。如果您谈论的是从
request.getRemoteAddr()
返回的值,那么是的,这是可能的。

实现这一点的方法是在web应用程序中设置一个servlet过滤器,该过滤器将截获所有URL(或仅截获您希望X-REAL-IP返回的URL),并将传入请求包装到
HttpServletRequestWrapper
的子代中,该子代将覆盖
getRemoteAddr()
返回X-REAL-IP值。

您可以使用Tomcat的
RemoteIpValve执行此操作

<Valve className="org.apache.catalina.valves.RemoteIpValve"
           remoteIpHeader="X-REAL-IP"
           requestAttributesEnabled="true"
           internalProxies="127.0.0.1"  />


这样,当您调用
request.getRemoteAddr()
时,它将提供正确的信息。顺便说一下,您可能希望使用更标准的标题,即
X-Forwarded-For

您可以使用Tomcat的
RemoteIpValve

<Valve className="org.apache.catalina.valves.RemoteIpValve"
           remoteIpHeader="X-REAL-IP"
           requestAttributesEnabled="true"
           internalProxies="127.0.0.1"  />


这样,当您调用
request.getRemoteAddr()
时,它将提供正确的信息。顺便说一句,您可能希望使用更标准的标题,即
X-Forwarded-For

从技术上讲,使用HttpServletRequestWrapper并不必要-您可以随意扩展任何内容,但它非常易于使用。是的,一个过滤器就是答案——它可以移植到您使用的任何应用程序容器中(只要X-REAL-IP头在该容器中被发送和接受),从技术上讲,使用HttpServletRequestWrapper并不必要——您可以随意扩展任何应用程序,但它非常容易使用。是的,这里的答案是过滤器——它可以移植到您使用的任何应用程序容器中(只要X-REAL-IP头在该容器中被发送和接受)