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.IAppleService;
import com.yolo.keyborad.service.KeyboardUserLoginLogService; import com.yolo.keyborad.service.KeyboardUserLoginLogService;
import com.yolo.keyborad.service.UserService; import com.yolo.keyborad.service.UserService;
import com.yolo.keyborad.utils.RequestIpUtils;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import io.jsonwebtoken.*; import io.jsonwebtoken.*;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -100,7 +101,7 @@ public class AppleServiceImpl implements IAppleService {
// 记录登录日志 // 记录登录日志
try { try {
String ipAddress = request.getRemoteAddr(); String ipAddress = RequestIpUtils.resolveClientIp(request);
String userAgent = request.getHeader("User-Agent"); String userAgent = request.getHeader("User-Agent");
String platform = "Unknown"; String platform = "Unknown";
String os = "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.UserMailVerificationHandler;
import com.yolo.keyborad.service.impl.user.UserPasswordHandler; import com.yolo.keyborad.service.impl.user.UserPasswordHandler;
import com.yolo.keyborad.service.impl.user.UserRegistrationHandler; import com.yolo.keyborad.service.impl.user.UserRegistrationHandler;
import com.yolo.keyborad.utils.RequestIpUtils;
/* /*
* @author: ziin * @author: ziin
@@ -228,7 +229,7 @@ public class UserServiceImpl extends ServiceImpl<KeyboardUserMapper, KeyboardUse
private void recordLoginLogSafely(Long userId, HttpServletRequest request) { private void recordLoginLogSafely(Long userId, HttpServletRequest request) {
try { try {
String ipAddress = request.getRemoteAddr(); String ipAddress = RequestIpUtils.resolveClientIp(request);
String userAgent = request.getHeader("User-Agent"); String userAgent = request.getHeader("User-Agent");
String platform = resolvePlatform(userAgent); String platform = resolvePlatform(userAgent);
String os = resolveOs(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.model.entity.KeyboardUserInvites;
import com.yolo.keyborad.service.KeyboardUserInviteCodesService; import com.yolo.keyborad.service.KeyboardUserInviteCodesService;
import com.yolo.keyborad.service.KeyboardUserInvitesService; import com.yolo.keyborad.service.KeyboardUserInvitesService;
import com.yolo.keyborad.utils.RequestIpUtils;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.util.Date; import java.util.Date;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -73,7 +74,7 @@ public class UserInviteCodeBinder {
userInvite.setInviteCodeId(inviteCode.getId()); userInvite.setInviteCodeId(inviteCode.getId());
userInvite.setBindType(MANUAL_BIND_TYPE); userInvite.setBindType(MANUAL_BIND_TYPE);
userInvite.setBoundAt(new Date()); userInvite.setBoundAt(new Date());
userInvite.setBindIp(request.getRemoteAddr()); userInvite.setBindIp(RequestIpUtils.resolveClientIp(request));
userInvite.setBindUserAgent(request.getHeader("User-Agent")); userInvite.setBindUserAgent(request.getHeader("User-Agent"));
userInvite.setInviteType(inviteCode.getInviteType()); userInvite.setInviteType(inviteCode.getInviteType());
userInvite.setInviteCode(inviteCode.getCode()); userInvite.setInviteCode(inviteCode.getCode());
@@ -95,4 +96,3 @@ public class UserInviteCodeBinder {
inviteCodesService.updateById(inviteCode); 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());
}
}