可以在 Controller 方法中直接注入 HttpServletRequest 对象,使用 request.getRemoteAddr() 方法获取客户端 IP 地址。例如:
@GetMapping("/getIp")
public String getIp(HttpServletRequest request) {
String ipAddress = request.getRemoteAddr();
return "Client IP Address: " + ipAddress;
}
当应用部署在负载均衡器或反向代理服务器后面时,直接使用 request.getRemoteAddr() 方法可能会获取到负载均衡器或反代服务器的 IP,而不是真实的客户端 IP。这种情况下可以使用 X-Forwarded-For 头部信息来获取客户端 IP。例如:
@GetMapping("/getIp")
public String getIp(HttpServletRequest request) {
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
return "Client IP Address: " + ipAddress;
}
除使用 HttpServletRequest 对象,也可以使用 InetAddress 类来获取客户端 IP 地址。例如:
@GetMapping("/getIp")
public String getIp(HttpServletRequest request) {
String ipAddress = InetAddress.getByName(request.getRemoteAddr()).getHostAddress();
return "Client IP Address: " + ipAddress;
}