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