Skip to content

UserContextHolder-用户上下文 Holder

最后更新: 14 小时前
属性名称属性值
所在模块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)

权限判断

java
// 判断当前用户是否为管理员
public static boolean isAdmin()

使用示例

获取当前用户信息

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

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

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

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

获取用户上下文详细信息

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. UserContextHolder 类使用了 ThreadLocal 存储用户上下文,在使用完毕后应当调用 clearContext() 方法清除上下文,避免内存泄漏。
  2. 在多线程环境下,子线程无法自动继承父线程的 ThreadLocal 变量,如需在子线程中访问用户上下文,需要手动传递。
  3. 该类与 Sa-Token 框架紧密集成,部分方法依赖于 Sa-Token 的会话管理功能。
  4. 获取用户信息时使用了 ExceptionUtils.exToNull() 方法进行异常处理,当用户未登录时会返回 null 而不是抛出异常。
  5. isAdmin() 方法会先检查用户是否已登录,未登录时会抛出异常,使用前应确保用户已登录。