zoukankan      html  css  js  c++  java
  • 使用ThreadLocal获取登录者的信息

    1.工具类(定义ThreadLocal)

    public class UserThreadLocal {
        
        private static ThreadLocal<User> userThread = new ThreadLocal<>();
        
        public static void set(User user){
            
            userThread.set(user);
        }
        
        public static User get(){
            
            return userThread.get();
        }
        
        //防止内存泄漏
        public static void remove(){
            
            userThread.remove();
        }
        
    }

    2.在拦截器中获取用户信息,并存入ThreadLocal中

    //定义用户拦截器
    public class UserInterceptor implements HandlerInterceptor{
        
        @Autowired
        private JedisCluster jedisCluster;
        private ObjectMapper objectMapper = new ObjectMapper();
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            //1.获取Cookiez中的token
            String token = null;
            Cookie[] cookies = request.getCookies();
            for (Cookie cookie : cookies) {
                if("JT_TICKET".equals(cookie.getName())){
                    token = cookie.getValue();
                    break;
                }
            }
            
            //2.判断token是否有数据
            if(token != null){
                //2.1判断redis集群中是否有数据
                String userJSON = jedisCluster.get(token);
                if(userJSON != null){
                    User user = objectMapper.readValue(userJSON,User.class);
                    //将user数据保存到ThreadLocal中
                    UserThreadLocal.set(user);
                    //证明用户已经登陆 予以放行
                    return true;
                }
            }
            
            //配置重定向
            response.sendRedirect("/user/login.html");
            return false;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            
            //关闭threadLocal
            UserThreadLocal.remove();
            
        }
    }

    3.在controller层中获取用户信息,并将信息移出ThreadLocal

        /*
         * 1.实现订单确认页面的跳转
         * url: /order/create.html 
         */
        @RequestMapping("/create")
        public String create(Model model){
            Long userId = UserThreadLocal.get().getId();
            //根据userId查询购物车信息
            List<Cart> cartList = cartService.findCartByUserId(userId);
            UserThreadLocal.remove();
            model.addAttribute("carts", cartList);
            return "order-cart";
        }
  • 相关阅读:
    BZOJ4237:稻草人
    BZOJ4009:[HNOI2015]接水果(整体二分版)
    BZOJ3745:[COCI2015]Norma
    BZOJ3110:[ZJOI2013]K大数查询(整体二分版)
    BZOJ2716:[Violet 3]天使玩偶
    BZOJ2527:[POI2011]Meteors
    BZOJ4170:极光
    BZOJ1901:Dynamic Rankings
    Python基础终极实战 基于C/S架构的仿优酷项目
    大白话五种IO模型
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11724698.html
Copyright © 2011-2022 走看看