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