Skip to content

UserContextHolder 用户上下文工具类

最后更新: 4 天前
实践版本: v4.0.0
属性名称属性值
所在模块continew-common
类路径top.continew.admin.common.context.UserContextHolder
描述用户上下文管理工具类

简介

UserContextHolder 是一个基于 ThreadLocal 实现的用户上下文管理工具类,用于存储和访问当前线程的用户信息。它与 Sa-Token 框架紧密集成,实现了用户会话的有效管理。该类提供了丰富的静态方法,方便快速存取用户基本信息、权限信息及登录环境等上下文数据。

核心功能

  • 用户上下文管理:存储和获取当前线程的用户信息
  • 额外上下文管理:存储和获取当前线程的用户登录环境信息(IP、浏览器、操作系统等)
  • 信息快捷访问:提供便捷方法获取用户ID、用户名、昵称等核心信息
  • 权限判断功能:提供判断当前用户是否为超级管理员等实用方法

常用 API

用户上下文管理

设置用户上下文

java
// 设置上下文并更新会话
public static void setContext(UserContext context)

// 设置上下文,可选择是否更新会话
public static void setContext(UserContext context, boolean isUpdate)

获取用户上下文

java
// 获取当前用户的上下文
public static UserContext getContext()

// 获取指定用户ID的上下文
public static UserContext getContext(Long userId)

清除上下文

java
// 清除当前线程的用户上下文和额外上下文
public static void clearContext()

用户额外上下文管理

设置用户额外上下文

java
public static void setExtraContext(UserExtraContext context)

获取用户额外上下文

java
// 获取当前用户的额外上下文
public static UserExtraContext getExtraContext()

// 根据令牌获取用户额外上下文
public static UserExtraContext getExtraContext(String token)

用户信息快捷访问

java
// 获取当前用户ID
public static Long getUserId()

// 获取当前用户名
public static String getUsername()

// 获取当前用户昵称
public static String getNickname()

// 获取指定用户ID的昵称
public static String getNickname(Long userId)

// 获取当前用户的租户 ID
Long tenantId = UserContextHolder.getTenantId();

权限判断

java
// 判断当前用户是否为超级管理员用户
boolean isSuperAdminUser = UserContextHolder.isSuperAdminUser();

// 判断当前用户是否为租户管理员用户
boolean isTenantAdminUser = UserContextHolder.isTenantAdminUser();

使用示例

获取当前用户信息

java
// 获取当前登录用户ID
Long userId = UserContextHolder.getUserId();

// 获取当前登录用户名
String username = UserContextHolder.getUsername();

// 获取当前登录用户昵称
String nickname = UserContextHolder.getNickname();

获取用户上下文详细信息

java
// 获取完整的用户上下文对象
UserContext userContext = UserContextHolder.getContext();

// 获取用户权限列表
Set<String> permissions = userContext.getPermissions();

// 获取用户角色编码列表
Set<String> roleCodes = userContext.getRoleCodes();

// 判断密码是否过期
boolean isPasswordExpired = userContext.isPasswordExpired();

获取用户登录环境信息

java
// 获取用户额外上下文
UserExtraContext extraContext = UserContextHolder.getExtraContext();

// 获取用户IP地址
String ip = extraContext.getIp();

// 获取用户IP归属地
String address = extraContext.getAddress();

// 获取用户浏览器信息
String browser = extraContext.getBrowser();

// 获取用户操作系统信息
String os = extraContext.getOs();

// 获取用户登录时间
LocalDateTime loginTime = extraContext.getLoginTime();

注意事项

  1. 内存泄漏防护:由于使用 ThreadLocal 存储用户上下文,使用完毕后务必调用 clearContext() 方法清除上下文,避免内存泄漏。
  2. 多线程处理:在多线程环境下,子线程无法自动继承父线程的 ThreadLocal 变量。如需在子线程中访问用户上下文,需手动传递。
  3. 框架依赖:该类与 Sa-Token 框架紧密集成,部分方法依赖于 Sa-Token 的会话管理功能。
  4. 异常处理:获取用户信息时使用 ExceptionUtils.exToNull() 方法进行异常处理,用户未登录时会返回 null 而非抛出异常。
  5. 权限检查前置条件isSuperAdminUser() 方法会先检查用户是否已登录,未登录时会抛出异常,使用前应确保用户已登录状态。