diff --git a/src/main/java/com/mir4updater/backend/controller/IpController.java b/src/main/java/com/mir4updater/backend/controller/IpController.java new file mode 100644 index 0000000..3887de9 --- /dev/null +++ b/src/main/java/com/mir4updater/backend/controller/IpController.java @@ -0,0 +1,16 @@ +package com.mir4updater.backend.controller; + +import com.mir4updater.backend.utils.IpUtils; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class IpController { + + @GetMapping("/public-ip") + public String getPublicIp(HttpServletRequest request) { + String clientIp = IpUtils.getClientIpAddress(request); + return "Your public IP address is: " + clientIp; + } +} \ No newline at end of file diff --git a/src/main/java/com/mir4updater/backend/utils/IpUtils.java b/src/main/java/com/mir4updater/backend/utils/IpUtils.java new file mode 100644 index 0000000..302aa80 --- /dev/null +++ b/src/main/java/com/mir4updater/backend/utils/IpUtils.java @@ -0,0 +1,44 @@ +package com.mir4updater.backend.utils; + +import jakarta.servlet.http.HttpServletRequest; + +public class IpUtils { + public static String getClientIpAddress(HttpServletRequest request) { + String[] headersToCheck = { + "X-Forwarded-For", + "Proxy-Client-IP", + "WL-Proxy-Client-IP", + "HTTP_CLIENT_IP", + "HTTP_X_FORWARDED_FOR" + }; + + String ip = null; + for (String header : headersToCheck) { + ip = request.getHeader(header); + if (isValidIp(ip)) { + break; + } + } + + // 处理多IP情况 + if (ip != null && ip.contains(",")) { + ip = ip.split(",")[0].trim(); + } + + // 回退到默认方法 + if (!isValidIp(ip)) { + ip = request.getRemoteAddr(); + } + + // 处理IPv6本地地址 + if ("0:0:0:0:0:0:0:1".equals(ip)) { + ip = "127.0.0.1"; + } + + return ip; + } + + private static boolean isValidIp(String ip) { + return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip); + } +}