我正在为客户端设置一个项目的演示。 在我的服务器上,我有很多使用不同技术构build的站点,这些技术在不同端口上的不同服务器上运行。 我使用nginx作为所有的反向代理。 这个特定的应用程序是使用java(spring MVC / Blazeds)构build的,将会在tomcat 6下进行演示(可能还在生产中)。 作为反向代理使用时,Nginx具有很好的设置,使其能够在X-REAL-IP头中传递原始请求的IP地址。 我想要做的是设置我的应用程序或至lesstomcat将X-REAL-IP标头作为真正的请求IP地址。 这可能吗?
这取决于你的意思是“真正的请求知识产权”。 如果你正在讨论从request.getRemoteAddr()
返回的值,那么是的,这是可能的。
这样做的方法是在您的Web应用程序中设置一个拦截所有URL的servlet过滤器(或者只有您希望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
。