2009-07-26 20 views
0

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

回答

3

这取决于你的意思是“真正的请求IP”。如果你正在谈论从request.getRemoteAddr()返回的价值,那么是的,这是可能的。
这样做的方法是在您的Web应用程序中设置一个拦截所有URL(或仅限您希望X-REAL-IP返回的URL)的servlet过滤器,并让该过滤器将传入的请求包装为后代的HttpServletRequestWrapper,它将覆盖getRemoteAddr()以返回X-REAL-IP值。

+0

使用HttpServletRequestWrapper在技术上并不亲切 - 您可以自由地扩展任何内容,但它非常易于使用。是的,过滤器就是这里的答案 - 它可以移植到任何应用程序容器上(只要X-REAL-IP标头在该容器中发送并接受) – MetroidFan2002 2009-07-27 03:09:25

0

为此,您可以使用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