|
@@ -22,6 +22,7 @@ import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
+import java.net.InetAddress;
|
|
import java.time.Instant;
|
|
import java.time.Instant;
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
import java.time.ZoneId;
|
|
import java.time.ZoneId;
|
|
@@ -217,15 +218,43 @@ public class WechatCallbackController {
|
|
}
|
|
}
|
|
|
|
|
|
private String getClientIp(HttpServletRequest request) {
|
|
private String getClientIp(HttpServletRequest request) {
|
|
- String ipAddress = request.getHeader("X-Forwarded-For");
|
|
|
|
- if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
|
|
|
|
- ipAddress = request.getRemoteAddr();
|
|
|
|
|
|
+ // 1. 检查云服务商特殊头部
|
|
|
|
+ String ip = request.getHeader("X-Real-IP");
|
|
|
|
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = request.getHeader("X-Forwarded-For");
|
|
}
|
|
}
|
|
- // 如果有多个 IP,取第一个
|
|
|
|
- if (ipAddress != null && ipAddress.contains(",")) {
|
|
|
|
- ipAddress = ipAddress.split(",")[0];
|
|
|
|
|
|
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = request.getHeader("Proxy-Client-IP");
|
|
}
|
|
}
|
|
- return ipAddress;
|
|
|
|
|
|
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = request.getHeader("WL-Proxy-Client-IP");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 2. 处理多级代理
|
|
|
|
+ if (ip != null && ip.contains(",")) {
|
|
|
|
+ ip = Arrays.stream(ip.split(","))
|
|
|
|
+ .map(String::trim)
|
|
|
|
+ .filter(part -> !"unknown".equalsIgnoreCase(part))
|
|
|
|
+ .findFirst()
|
|
|
|
+ .orElse(null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 3. 最终回退
|
|
|
|
+ if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = request.getRemoteAddr();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 4. 本地测试兼容
|
|
|
|
+ if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
|
|
|
|
+ // 如果是本地测试,尝试从其他渠道获取(如网络接口)
|
|
|
|
+ try {
|
|
|
|
+ ip = InetAddress.getLocalHost().getHostAddress();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ ip = "127.0.0.1";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return ip;
|
|
}
|
|
}
|
|
|
|
|
|
// Unix时间戳(秒) -> LocalDateTime
|
|
// Unix时间戳(秒) -> LocalDateTime
|