接口优化

This commit is contained in:
2025-09-08 17:54:12 +08:00
parent e20030f10d
commit d42d689bd7
84 changed files with 6403 additions and 4310 deletions
@@ -1,57 +1,94 @@
package com.emotion.util;
import com.emotion.util.UserContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
/**
* 用户上下文工具类
* 提供便捷的用户上下文操作方法
* 提供便捷的方法操作用户上下文信息
*
* @author emotion-museum
* @date 2025-07-23
* @date 2025-07-25
*/
@Slf4j
public class UserContextUtils {
/**
* 获取当前用户ID,如果为空则返回默认值
* 获取当前用户ID
*
* @param defaultValue 默认值
* @return 用户ID
* @return 当前用户ID,如果未登录则返回null
*/
public static String getCurrentUserIdOrDefault(String defaultValue) {
String userId = UserContextHolder.getCurrentUserId();
return userId != null ? userId : defaultValue;
public static String getCurrentUserId() {
return UserContextHolder.getCurrentUserId();
}
/**
* 获取当前用户ID,如果为空则返回"system"
* 获取当前用户
*
* @return 用户ID
* @return 当前用户名,如果未登录则返回null
*/
public static String getCurrentUserIdOrSystem() {
return getCurrentUserIdOrDefault("system");
public static String getCurrentUsername() {
return UserContextHolder.getCurrentUsername();
}
/**
* 获取当前用户名,如果为空则返回默认值
* 获取当前用户类型
*
* @param defaultValue 默认值
* @return 用户名
* @return 当前用户类型,如果未登录则返回null
*/
public static String getCurrentUsernameOrDefault(String defaultValue) {
String username = UserContextHolder.getCurrentUsername();
return username != null ? username : defaultValue;
public static String getCurrentUserType() {
return UserContextHolder.getCurrentUserType();
}
/**
* 获取当前用户名,如果为空则返回"guest"
* 获取客户端IP
*
* @return 用户名
* @return 客户端IP
*/
public static String getCurrentUsernameOrGuest() {
return getCurrentUsernameOrDefault("guest");
public static String getClientIp() {
return UserContextHolder.getClientIp();
}
/**
* 获取请求ID
*
* @return 请求ID
*/
public static String getRequestId() {
return UserContextHolder.getRequestId();
}
/**
* 获取当前用户ID,如果未登录则抛出异常
*
* @return 当前用户ID
* @throws IllegalStateException 如果用户未登录
*/
public static String requireCurrentUserId() {
String userId = getCurrentUserId();
if (userId == null || userId.trim().isEmpty()) {
throw new IllegalStateException("用户未登录或认证失败");
}
return userId;
}
/**
* 获取当前用户名,如果未登录则抛出异常
*
* @return 当前用户名
* @throws IllegalStateException 如果用户未登录
*/
public static String requireCurrentUsername() {
String username = getCurrentUsername();
if (username == null || username.trim().isEmpty()) {
throw new IllegalStateException("用户未登录或认证失败");
}
return username;
}
/**
* 获取当前用户类型,如果为空则返回默认值
*
@@ -62,7 +99,7 @@ public class UserContextUtils {
String userType = UserContextHolder.getCurrentUserType();
return userType != null ? userType : defaultValue;
}
/**
* 获取当前用户类型,如果为空则返回"GUEST"
*
@@ -71,7 +108,7 @@ public class UserContextUtils {
public static String getCurrentUserTypeOrGuest() {
return getCurrentUserTypeOrDefault("GUEST");
}
/**
* 获取客户端IP,如果为空则返回默认值
*
@@ -82,7 +119,7 @@ public class UserContextUtils {
String clientIp = UserContextHolder.getClientIp();
return clientIp != null ? clientIp : defaultValue;
}
/**
* 获取客户端IP,如果为空则返回"unknown"
*
@@ -91,7 +128,7 @@ public class UserContextUtils {
public static String getClientIpOrUnknown() {
return getClientIpOrDefault("unknown");
}
/**
* 获取请求ID,如果为空则返回默认值
*
@@ -102,87 +139,27 @@ public class UserContextUtils {
String requestId = UserContextHolder.getRequestId();
return requestId != null ? requestId : defaultValue;
}
/**
* 获取请求ID,如果为空则返回"unknown"
* 获取请求ID,如果为空则返回随机UUID
*
* @return 请求ID
*/
public static String getRequestIdOrUnknown() {
return getRequestIdOrDefault("unknown");
}
/**
* 检查当前用户是否为访客
*
* @return 是否为访客
*/
public static boolean isGuest() {
String userId = UserContextHolder.getCurrentUserId();
String userType = UserContextHolder.getCurrentUserType();
return userId == null ||
userId.startsWith("guest_") ||
"GUEST".equalsIgnoreCase(userType);
}
/**
* 检查当前用户是否为系统用户
*
* @return 是否为系统用户
*/
public static boolean isSystem() {
String userId = UserContextHolder.getCurrentUserId();
String userType = UserContextHolder.getCurrentUserType();
return "system".equals(userId) ||
"SYSTEM".equalsIgnoreCase(userType);
}
/**
* 检查当前用户是否为注册用户
*
* @return 是否为注册用户
*/
public static boolean isRegisteredUser() {
return !isGuest() && !isSystem();
}
/**
* 安全地执行需要用户上下文的操作
* 如果没有用户上下文,会设置默认的系统上下文
*
* @param operation 操作
*/
public static void executeWithContext(Runnable operation) {
boolean hasContext = UserContextHolder.hasUserContext();
try {
// 如果没有用户上下文,设置默认的系统上下文
if (!hasContext) {
UserContextHolder.setUserContext("system", "system", "SYSTEM", "127.0.0.1", "system");
log.debug("设置默认系统用户上下文");
}
// 执行操作
operation.run();
} finally {
// 如果是我们设置的默认上下文,执行后清理
if (!hasContext) {
UserContextHolder.clear();
log.debug("清理默认系统用户上下文");
}
public static String getRequestIdOrRandom() {
String requestId = UserContextHolder.getRequestId();
if (requestId != null) {
return requestId;
}
return java.util.UUID.randomUUID().toString().replace("-", "");
}
/**
* 临时设置用户上下文执行操作
* 执行带有临时上下文操作
*
* @param userId 用户ID
* @param username 用户名
* @param userType 用户类型
* @param operation 操作
* @param userId 用户ID
* @param username 用户名
* @param userType 用户类型
* @param operation 要执行的操作
*/
public static void executeWithTempContext(String userId, String username, String userType, Runnable operation) {
// 保存当前上下文
@@ -211,4 +188,59 @@ public class UserContextUtils {
}
}
}
}
/**
* 从HTTP请求中获取客户端真实IP地址
*
* @param request HTTP请求
* @return 客户端IP地址
*/
public static String getClientIpAddress(HttpServletRequest request) {
String ip = null;
// 1. 从X-Forwarded-For获取(经过代理的情况)
ip = request.getHeader("X-Forwarded-For");
if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 多个IP的情况,取第一个
int index = ip.indexOf(',');
if (index != -1) {
ip = ip.substring(0, index);
}
return ip.trim();
}
// 2. 从X-Real-IP获取
ip = request.getHeader("X-Real-IP");
if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip.trim();
}
// 3. 从Proxy-Client-IP获取
ip = request.getHeader("Proxy-Client-IP");
if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip.trim();
}
// 4. 从WL-Proxy-Client-IP获取
ip = request.getHeader("WL-Proxy-Client-IP");
if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip.trim();
}
// 5. 从HTTP_CLIENT_IP获取
ip = request.getHeader("HTTP_CLIENT_IP");
if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip.trim();
}
// 6. 从HTTP_X_FORWARDED_FOR获取
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip.trim();
}
// 7. 最后从getRemoteAddr获取
ip = request.getRemoteAddr();
return StringUtils.hasText(ip) ? ip.trim() : "unknown";
}
}