在Java的微服务中,如果需要获取发起 POST 请求的客户端 IP 地址(即请求来源的 IP 地址),可以通过以下方法实现:
使用 HttpServletRequest
通过 HttpServletRequest
对象获取请求信息,其中包含了客户端 IP 地址。
获取 IP 地址的步骤解析
- 通过 HTTP 请求头获取:
- 检查
X-Forwarded-For
,此头通常由代理服务器或负载均衡器添加,包含客户端的真实 IP 地址。 - 检查其他常见的代理头,如
Proxy-Client-IP
和WL-Proxy-Client-IP
。
- 检查
- 获取
RemoteAddr
:- 如果以上头部信息为空,使用
request.getRemoteAddr()
获取直接连接到微服务的客户端 IP。
- 如果以上头部信息为空,使用
- 处理代理多级 IP:
- 如果
X-Forwarded-For
中有多个 IP(代理链路),取第一个 IP 作为客户端 IP。
- 如果
注意事项
- 代理和负载均衡器配置:
- 如果你的微服务运行在代理或负载均衡器后,请确保代理将
X-Forwarded-For
等头部传递到后端服务。
- 如果你的微服务运行在代理或负载均衡器后,请确保代理将
- 安全性:
- 请求头中的 IP 地址可能被伪造,因此在安全敏感场景中需要验证来源。
- 实际测试:
- 部署后使用真实请求测试 IP 获取功能,以验证代理配置是否正确。
Spring Boot 示例
在 Spring Boot 中,你可以使用 HttpServletRequest
来获取客户端 IP:
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping(“/api”)
public class MyController {
@PostMapping(“/process”)
public String processRequest(HttpServletRequest request) {
String clientIp = getClientIp(request);
return “Client IP is: ” + clientIp;
}
private String getClientIp(HttpServletRequest request) {
String ipAddress = request.getHeader(“X-Forwarded-For”);
if (ipAddress == null || ipAddress.isEmpty() || “unknown”.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(“Proxy-Client-IP”);
}
if (ipAddress == null || ipAddress.isEmpty() || “unknown”.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader(“WL-Proxy-Client-IP”);
}
if (ipAddress == null || ipAddress.isEmpty() || “unknown”.equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
if (ipAddress != null && ipAddress.contains(“,”)) {
ipAddress = ipAddress.split(“,”)[0].trim();
}
return ipAddress;
}
}