Spring,Tomcat – 获取负载均衡器后面的真实 IP

Spring,Tomcat – 获取负载均衡器后面的真实 IP

原文: https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/

通常,出于日志记录和安全目的,我们需要传入请求的 IP 地址信息。 在任何 Java Web 应用中,都可以使用getRemoteAddr()方法获取 IP 地址。

String httpServletAddress = request.getRemoteAddr();

但是,如果您的应用在负载均衡器代理后面运行,并且您希望转换用户使用的真实请求 IP 而不是我们的应用实例收到请求时来自代理的 IP,那么上述语句即可获取 IP 仅均衡器代理的地址。

使用 Tomcat 的RemoteIpFilter

在上述情况下,可以使用 tomcat 提供的RemoteIpFilter servlet 过滤器。

要进行配置,请使用 Java 配置RemoteIpFilter – 在 spring boot 应用中,使用@Configuration注解注册 bean。

@Configuration
public class WebConfiguration {
	@Bean
	public RemoteIpFilter remoteIpFilter() {
		return new RemoteIpFilter();
	}
}

或使用 XML 配置,例如web.xml – 使用filter标签。

<filter>
    <filter-name>RemoteIpFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
 </filter>

 <filter-mapping>
    <filter-name>RemoteIpFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
 </filter-mapping>

注册上述过滤器后,启动应用。

现在,当您使用request.remoteAddr()方法时,您将获得呼叫客户端的正确 IP 地址。

阅读更多:RemoteIpFilter

RemoteIpFilter在内部集成了X-Forwarded-ForX-Forwarded-Proto HTTP 标头。

该 Servlet 过滤器的另一个功能是通过请求标头(例如“X-Forwarded-Proto”),用代理或负载均衡器提供的方案替换表观方案(http / https)和服务器端口。

学习愉快!