微服务通过X-Forwarded-For获取客户端最原始的IP地址

时间:2024-10-28 07:28:21

文章目录

  • 引言
  • I 通过转发IP列表获取用户的IP地址
  • II 存储真实IP字段到MDC中
    • 2.1 自己存储真实IP字段,方便获取。
    • 2.2 feign 传递MDC数据(将MDC中数据传入header)
  • III 处理真实IP(应用)
    • 3.1 从MDC获取存储到日志系统中
    • 3.2 logback获取MDC数据(IP、追踪码)
    • 3.3 打印接口的请求IP

引言

获取客户端最原始的IP地址的应用场景:

  1. 登录日志/接口日志

  2. IP访问限制、限流

实现方案:通过X-Forwarded-For获取客户端最原始的IP地址

X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。

I 通过转发IP列表获取用户的IP地址

X-Forwarded-For是用于记录代理信息的,每经过一级代理,该字段就会记录来源地址,经过多级代理,服务端就会记录每级代理的X-Forwarded-For信息,IP之间以“,”分隔开。

获取X-Forwarded-For中的第一个IP,就是用户的真实IP。

public class IpUtil {
 
    public static String getIpAddress(HttpServletRequest request) {
        //目前则是网关ip
        String ip = request.getHeader("X-Forwarded-For");
        if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
            int index = ip.indexOf(',');
            if (index != -1) {
                //只获取第一个值
                return ip.substring(0, index);
            } else {
                return ip;
            }
        } else {
            //取不到真实ip则返回空,不能返回内网地址。
            return null;
        }
    }
 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

II 存储真实IP字段到MDC中

2.1 自己存储真实IP字段,方便获取。

可以存储在请求头或者MDC中。

在 Java 后端开发中,MDC(Mapped Diagnostic Context) 是 SLF4J 和 Logback 提供的一种机制,用于在日志记录中添加上下文信息。 方法用于从当前线程的上下文中获取特定的键值。

MDC是一个线程安全的存放诊断日志的容器,MDC的底层是用了ThreadLocal来保存数据的,我们可以用它传递参数。

  1. 请求头字段X-Real-IP,记录真实发出请求的客户端IP。该字段不是header中自带的,需要自行添加配置。

  2. 真实IP存储在org.

2.2 feign 传递MDC数据(将MDC中数据传入header)

III 处理真实IP(应用)

3.1 从MDC获取存储到日志系统中

3.2 logback获取MDC数据(IP、追踪码)

%X用于输出和当前线程相关联的MDC(调试上下文),在代码中给org.添加key/value即可增加新值

示例 说明
%X 输出所有值
%X{testKey} 输出testKey所对应的value,且无默认值
%X{testKey:-} 输出testKey所对应的value,默认为空
%X{testKey:-aaa} 输出testKey所对应的value,默认为aaa

3.3 打印接口的请求IP