其他分享
首页 > 其他分享> > 4.7优化登录模块

4.7优化登录模块

作者:互联网

在这里插入图片描述

重构验证码

设置验证码的redisKey

    //登录验证码
    public static String getKaptchaKey(String owner){
        return PREFIX_KAPTCHA + SPLIT + owner;
    }

重构获取验证码的方法


        //重构
        //验证码的归属
        String kaptchaOwner = CommunityUtil.generateUUID();
        Cookie cookie = new Cookie("kaptchaOwner",kaptchaOwner);
        cookie.setMaxAge(60);
        cookie.setPath(contextPath);
        response.addCookie(cookie);
        //将验证码存入redis
        String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner);
        redisTemplate.opsForValue().set(redisKey,text,60, TimeUnit.SECONDS);

在用到验证码的地方修改获得验证码的途径(这回通过redis获取)

    @RequestMapping(path = "/login",method = RequestMethod.POST)
    public String login(String username,String password,
                        String code,boolean rememberme,Model model/*,
                        HttpSession session*/,HttpServletResponse response,
                        @CookieValue("kaptchaOwner") String kaptchaOwner){

        //判断验证码,从session中取
//        String kapthca = (String)session.getAttribute("kaptcha");
        //重构
        String kapthca = null;
        if (StringUtils.isNotBlank(kaptchaOwner)){
            String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner);
            kapthca = (String)redisTemplate.opsForValue().get(redisKey);
        }

重构存储登录凭证

设置登录的redisKey

    //登录的凭证
    public static String getTicketKey(String ticket){
        return PREFIX_TICKET + SPLIT + ticket;
    }

在用到登录凭证的地方修改获取途径

    public LoginTicket findLoginTicket(String ticket){
//       return  loginTicketMapper.selectByTicket(ticket);
        String redisKey = RedisKeyUtil.getTicketKey(ticket);
        return (LoginTicket) redisTemplate.opsForValue().get(redisKey);
    }
    public Map<String,Object> updatePassword(String ticket,String newPassword,String oldPassword){
        //通过ticket得到当前用户
        String redisKey = RedisKeyUtil.getTicketKey(ticket);
        LoginTicket loginTicket = (LoginTicket) redisTemplate.opsForValue().get(redisKey);
        User user = userMapper.selectById(loginTicket.getUserId());

用redis缓存用户信息

设置用户的redisKey

    // 用户
    public static String getUserKey(int userId){
        return PREFIX_USER+ SPLIT +userId;
    }

三个用于处理用户缓存的方法

    //1.优先从缓存中取值
    private User getCache(int userId){
        String redisKey = RedisKeyUtil.getUserKey(userId);
        return (User) redisTemplate.opsForValue().get(redisKey);
    }

    //2.取不到的时候就初始化缓存数据
    private User initCache(int userId){
        User user = userMapper.selectById(userId);
        String redisKey = RedisKeyUtil.getUserKey(userId);
        redisTemplate.opsForValue().set(redisKey,user,3600, TimeUnit.SECONDS);

        return user;
    }

    //3.当数据变化时,要清除缓存数据
    private void clearCache(int userId){
        String redisKey = RedisKeyUtil.getUserKey(userId);
        redisTemplate.delete(redisKey);
    }

在需要清除缓存的地方调用上述三个方法

    public User findUserById(int userId){
//        return userMapper.selectById(userId);
        User user = getCache(userId);
        if (user == null){
            user = initCache(userId);
        }

        return user;
    }
    public int updateHeader(int userId,String headerUrl){
        int rows = userMapper.updateHeader(userId, headerUrl);
        clearCache(userId);
        return  rows;

    }

标签:4.7,return,String,登录,userId,验证码,redisKey,模块,ticket
来源: https://blog.csdn.net/weixin_44114392/article/details/112578056