在Java的微服务中,如果需要获取发起 POST 请求的客户端 IP 地址(即请求来源的 IP 地址),可以通过以下方法实现:

使用 HttpServletRequest

通过 HttpServletRequest 对象获取请求信息,其中包含了客户端 IP 地址。

获取 IP 地址的步骤解析

  1. 通过 HTTP 请求头获取:
    • 检查 X-Forwarded-For,此头通常由代理服务器或负载均衡器添加,包含客户端的真实 IP 地址。
    • 检查其他常见的代理头,如 Proxy-Client-IPWL-Proxy-Client-IP
  2. 获取 RemoteAddr
    • 如果以上头部信息为空,使用 request.getRemoteAddr() 获取直接连接到微服务的客户端 IP。
  3. 处理代理多级 IP:
    • 如果 X-Forwarded-For 中有多个 IP(代理链路),取第一个 IP 作为客户端 IP。

注意事项

  1. 代理和负载均衡器配置:
    • 如果你的微服务运行在代理或负载均衡器后,请确保代理将 X-Forwarded-For 等头部传递到后端服务。
  2. 安全性:
    • 请求头中的 IP 地址可能被伪造,因此在安全敏感场景中需要验证来源。
  3. 实际测试:
    • 部署后使用真实请求测试 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;
}
}

苏ICP备18039385号