java如何获取源ip
获取源IP的方法
在Java中获取源IP地址通常涉及从HTTP请求中提取客户端IP。以下是几种常见的方法:
从HttpServletRequest获取IP
在Servlet或Spring MVC中,可以通过HttpServletRequest对象获取客户端IP地址。需要考虑代理服务器(如Nginx)转发请求时添加的头部信息。
public String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
使用Spring框架的注解
在Spring Boot中,可以直接通过@RequestHeader注解获取特定头部的IP地址,或通过注入HttpServletRequest对象调用上述方法。
@GetMapping("/ip")
public String getIp(@RequestHeader(value = "X-Forwarded-For", required = false) String xForwardedFor,
HttpServletRequest request) {
String ip = xForwardedFor != null ? xForwardedFor : request.getRemoteAddr();
return ip;
}
处理多级代理的情况
如果请求经过多级代理(如CDN),X-Forwarded-For可能包含多个IP地址(以逗号分隔),此时通常取第一个非未知的IP:

public String getClientIp(HttpServletRequest request) {
String xff = request.getHeader("X-Forwarded-For");
if (xff != null) {
String[] ips = xff.split(",");
for (String ip : ips) {
ip = ip.trim();
if (!ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
}
}
return request.getRemoteAddr();
}
注意事项
- 本地测试时,
request.getRemoteAddr()可能返回127.0.0.1或IPv6地址0:0:0:0:0:0:0:1。 - 如果服务部署在反向代理(如Nginx)后,需确保代理正确设置了
X-Forwarded-For头部。 - 部分云服务商(如AWS ALB)可能使用其他头部(如
X-Real-IP),需根据实际环境调整逻辑。






