文章目录
- 引言
- 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地址的应用场景:
-
登录日志/接口日志
-
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来保存数据的,我们可以用它传递参数。
-
请求头字段X-Real-IP,记录真实发出请求的客户端IP。该字段不是header中自带的,需要自行添加配置。
-
真实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 |