feat(service): 使用 RequestIpUtils 统一解析客户端真实 IP

This commit is contained in:
2026-03-23 16:51:52 +08:00
parent b1ef4ee192
commit 14806a9437
4 changed files with 53 additions and 4 deletions

View File

@@ -13,6 +13,7 @@ import com.yolo.keyborad.model.vo.user.KeyboardUserRespVO;
import com.yolo.keyborad.service.IAppleService;
import com.yolo.keyborad.service.KeyboardUserLoginLogService;
import com.yolo.keyborad.service.UserService;
import com.yolo.keyborad.utils.RequestIpUtils;
import jakarta.servlet.http.HttpServletRequest;
import io.jsonwebtoken.*;
import jakarta.annotation.Resource;
@@ -100,7 +101,7 @@ public class AppleServiceImpl implements IAppleService {
// 记录登录日志
try {
String ipAddress = request.getRemoteAddr();
String ipAddress = RequestIpUtils.resolveClientIp(request);
String userAgent = request.getHeader("User-Agent");
String platform = "Unknown";
String os = "Unknown";

View File

@@ -31,6 +31,7 @@ import com.yolo.keyborad.service.impl.user.UserInviteCodeBinder;
import com.yolo.keyborad.service.impl.user.UserMailVerificationHandler;
import com.yolo.keyborad.service.impl.user.UserPasswordHandler;
import com.yolo.keyborad.service.impl.user.UserRegistrationHandler;
import com.yolo.keyborad.utils.RequestIpUtils;
/*
* @author: ziin
@@ -228,7 +229,7 @@ public class UserServiceImpl extends ServiceImpl<KeyboardUserMapper, KeyboardUse
private void recordLoginLogSafely(Long userId, HttpServletRequest request) {
try {
String ipAddress = request.getRemoteAddr();
String ipAddress = RequestIpUtils.resolveClientIp(request);
String userAgent = request.getHeader("User-Agent");
String platform = resolvePlatform(userAgent);
String os = resolveOs(userAgent);

View File

@@ -7,6 +7,7 @@ import com.yolo.keyborad.model.entity.KeyboardUserInviteCodes;
import com.yolo.keyborad.model.entity.KeyboardUserInvites;
import com.yolo.keyborad.service.KeyboardUserInviteCodesService;
import com.yolo.keyborad.service.KeyboardUserInvitesService;
import com.yolo.keyborad.utils.RequestIpUtils;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
import org.springframework.stereotype.Component;
@@ -73,7 +74,7 @@ public class UserInviteCodeBinder {
userInvite.setInviteCodeId(inviteCode.getId());
userInvite.setBindType(MANUAL_BIND_TYPE);
userInvite.setBoundAt(new Date());
userInvite.setBindIp(request.getRemoteAddr());
userInvite.setBindIp(RequestIpUtils.resolveClientIp(request));
userInvite.setBindUserAgent(request.getHeader("User-Agent"));
userInvite.setInviteType(inviteCode.getInviteType());
userInvite.setInviteCode(inviteCode.getCode());
@@ -95,4 +96,3 @@ public class UserInviteCodeBinder {
inviteCodesService.updateById(inviteCode);
}
}

View File

@@ -0,0 +1,47 @@
package com.yolo.keyborad.utils;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;
public final class RequestIpUtils {
private static final String HEADER_X_FORWARDED_FOR = "X-Forwarded-For";
private static final String HEADER_X_REAL_IP = "X-Real-IP";
private static final String UNKNOWN_IP = "unknown";
private RequestIpUtils() {
}
public static String resolveClientIp(HttpServletRequest request) {
String forwardedFor = request.getHeader(HEADER_X_FORWARDED_FOR);
String forwardedIp = extractForwardedIp(forwardedFor);
if (forwardedIp != null) {
return forwardedIp;
}
String realIp = request.getHeader(HEADER_X_REAL_IP);
if (isValidIp(realIp)) {
return realIp.trim();
}
return request.getRemoteAddr();
}
private static String extractForwardedIp(String forwardedFor) {
if (!StringUtils.hasText(forwardedFor)) {
return null;
}
String[] ipList = forwardedFor.split(",");
for (String ip : ipList) {
if (isValidIp(ip)) {
return ip.trim();
}
}
return null;
}
private static boolean isValidIp(String ip) {
return StringUtils.hasText(ip) && !UNKNOWN_IP.equalsIgnoreCase(ip.trim());
}
}