当前位置:   article > 正文

基于threadlocal实现某个模块下的上下文传递(这里是传递的是用户id)_threadlocal传递上下文信息

threadlocal传递上下文信息

目的是为了 建一个工具类,让每个地方都可以用LongUtil去获取登录用户的id

 在subject应用层的全局配置GlobalConfig中实现以下的方法 :

  1. /**
  2. * 添加拦截器到Spring MVC的拦截器注册表中。
  3. *
  4. * 本方法重写了Spring Boot默认的addInterceptors方法,目的是为了注册自定义的拦截器LoginInterceptor。
  5. * 通过这个拦截器,可以对所有请求进行预处理,例如检查用户是否已登录。
  6. *
  7. * @param registry 拦截器注册表,用于添加新的拦截器和配置其对应的请求路径。
  8. */
  9. @Override
  10. protected void addInterceptors(InterceptorRegistry registry) {
  11. // 添加LoginInterceptor拦截器,并配置其拦截所有请求的路径。
  12. registry.addInterceptor(new LoginInterceptor())
  13. .addPathPatterns("/**");
  14. }

LoginInterceptor拦截器:

  1. /**
  2. * 登录拦截器类,用于在请求处理之前和处理之后进行相关逻辑处理。
  3. * 实现了HandlerInterceptor接口,以拦截器的形式增强应用程序的功能。
  4. */
  5. /**
  6. * 登录拦截器
  7. *
  8. * @author: ChickenWing
  9. * @date: 2023/11/26
  10. */
  11. public class LoginInterceptor implements HandlerInterceptor {
  12. /**
  13. * 在请求处理之前执行的逻辑。
  14. * 从请求头中获取登录ID,并将其设置到登录上下文中,以便后续使用。
  15. *
  16. * @param request HttpServletRequest对象,代表客户端的请求。
  17. * @param response HttpServletResponse对象,用于向客户端发送响应。
  18. * @param handler 将要处理请求的目标对象,可以是Controller等。
  19. * @return boolean 返回值总是true,表示继续处理请求。
  20. * @throws Exception 如果在处理过程中发生异常,可以抛出。
  21. */
  22. @Override
  23. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  24. // 从请求头中获取登录ID
  25. String loginId = request.getHeader("loginId");
  26. // 将登录ID设置到登录上下文中
  27. LoginContextHolder.set("loginId", loginId);
  28. // 允许请求继续处理
  29. return true;
  30. }
  31. /**
  32. * 在请求处理完成后执行的逻辑。
  33. * 从登录上下文中移除登录ID,进行资源清理。
  34. *
  35. * @param request HttpServletRequest对象,代表客户端的请求。
  36. * @param response HttpServletResponse对象,用于向客户端发送响应。
  37. * @param handler 将要处理请求的目标对象,可以是Controller等。
  38. * @param ex 在处理过程中抛出的异常,如果有的话。
  39. * @throws Exception 如果在处理过程中发生异常,可以抛出。
  40. */
  41. @Override
  42. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
  43. // 从登录上下文中移除登录ID
  44. LoginContextHolder.remove();
  45. }
  46. }

LoginContextHolder:
 

  1. // 登录上下文持有器类,用于在多线程环境中存储和获取登录信息
  2. public class LoginContextHolder {
  3. // 静态线程局部变量,使用InheritableThreadLocal保证子线程可以访问父线程的数据
  4. private static final InheritableThreadLocal<Map<String, Object>> THREAD_LOCAL
  5. = new InheritableThreadLocal<>();
  6. // 设置线程局部变量的键值对
  7. public static void set(String key, Object val) {
  8. // 获取或创建线程局部变量映射
  9. Map<String, Object> map = getThreadLocalMap();
  10. // 将键值对存入映射
  11. map.put(key, val);
  12. }
  13. // 根据键获取线程局部变量的值
  14. public static Object get(String key){
  15. // 获取线程局部变量映射
  16. Map<String, Object> threadLocalMap = getThreadLocalMap();
  17. // 返回对应键的值
  18. return threadLocalMap.get(key);
  19. }
  20. // 专门用于获取登录ID
  21. public static String getLoginId(){
  22. // 从线程局部变量映射中获取键为"loginId"的值并转换为String类型
  23. return (String) getThreadLocalMap().get("loginId");
  24. }
  25. // 清除线程局部变量
  26. public static void remove(){
  27. // 移除线程局部变量
  28. THREAD_LOCAL.remove();
  29. }
  30. // 获取或创建线程局部变量映射
  31. public static Map<String, Object> getThreadLocalMap() {
  32. // 尝试获取线程局部变量映射
  33. Map<String, Object> map = THREAD_LOCAL.get();
  34. // 如果映射为空,则创建一个新的ConcurrentHashMap
  35. if (Objects.isNull(map)) {
  36. map = new ConcurrentHashMap<>();
  37. // 将新创建的映射设置为线程局部变量
  38. THREAD_LOCAL.set(map);
  39. }
  40. // 返回线程局部变量映射
  41. return map;
  42. }
  43. }

LoginUtil:

  1. /**
  2. * 登录工具类,提供获取当前登录用户ID的方法。
  3. * 该类的设计目的是为了在系统中方便地获取当前登录用户的标识,以便进行权限检查或其他需要用户身份信息的操作。
  4. */
  5. public class LoginUtil {
  6. /**
  7. * 获取当前登录用户的ID。
  8. * 本方法通过调用LoginContextHolder中的getLoginId方法来实现,具体实现了如何从当前的上下文中获取登录用户ID的逻辑。
  9. * 对于调用者来说,无需关心具体的实现细节,只需通过本方法即可获取到当前登录用户的ID。
  10. *
  11. * @return 当前登录用户的ID,以字符串形式返回。
  12. */
  13. public static String getLoginId() {
  14. return LoginContextHolder.getLoginId();
  15. }
  16. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号