• 登录拦截器+ThreadLocal实现用户信息存储


    /**
     * 登录拦截器
     */
    public class LoginInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 在请求处理之前进行调用,返回true则继续向下执行,返回false则中断请求
            String loginId = request.getHeader("loginId");
            if (StringUtils.isNotBlank(loginId)) {
                // 如果请求头中包含loginId,将其设置到LoginContextHolder中
                LoginContextHolder.set("loginId", loginId);
            }
            return true;
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行,主要是做清理工作
            // 移除LoginContextHolder中的loginId
            LoginContextHolder.remove();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    public class LoginContextHolder {
    
        // 使用InheritableThreadLocal来存储线程局部变量,确保子线程可以继承父线程的值
        private static final InheritableThreadLocal<Map<String,Object>> THREAD_LOCAL =
                new InheritableThreadLocal<Map<String, Object>>();
    
        /**
         * 设置线程局部变量的值
         * @param key 键
         * @param val 值
         */
        public static void set(String key,Object val){
            Map<String,Object> map = getThreadLocalMap();
            map.put(key,val);
        }
    
        /**
         * 获取线程局部变量的值
         * @param key 键
         * @return 值
         */
        public static Object get(String key){
            Map<String, Object> threadLocalMap = getThreadLocalMap();
            return threadLocalMap.get(key);
        }
    
        /**
         * 移除线程局部变量
         */
        public static void remove(){
            THREAD_LOCAL.remove();
        }
    
        /**
         * 获取登录ID
         * @return 登录ID
         */
        public static String getLoginId(){
            return String.valueOf(getThreadLocalMap().get("loginId"));
        }
    
        /**
         * 获取线程局部变量的Map对象
         * @return Map对象
         */
        public static Map<String,Object> getThreadLocalMap(){
            Map<String, Object> map = THREAD_LOCAL.get();
    
            if(Objects.isNull(map)){
                map = new ConcurrentHashMap<>();
                THREAD_LOCAL.set(map);
            }
            return map;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    Debezium系列之第100篇文章:阶段性详细总结对Debezium使用方式的优化,详细介绍对Debezium集群和Kafka集群做的一系列优化
    用户登录Demo
    日志的概念
    三维重建一种实现算法
    微前端,qiankun的简单搭建
    Java的String
    Java接口的相关知识
    NIO的浅了解
    4. react路由
    2022 计网复习简答题【太原理工大学】
  • 原文地址:https://blog.csdn.net/qq_63140630/article/details/136489017