小大卫 2023-12-02 19:04 采纳率: 0%
浏览 55

黑马点评使用redis存储的登录模块

黑马点评项目我甚至把MvcConfig拦截器的代码注释掉仍然出现重复登录的情况,请问如何解决?

public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 发送手机验证码
     */
    @Override
    public Result sendCode(String phone, HttpSession session) {
        // TODO 发送短信验证码并保存验证码
        // 1.校验手机号
        if (RegexUtils.isPhoneInvalid(phone)) {
            // 2.如果不符合,返回错误信息
            return Result.fail("手机号格式错误!");
        }
        // 3.符合,生成验证码
        String code = RandomUtil.randomNumbers(6);

        // 4.保存验证码到 session
        //session.setAttribute("code",code);
        stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY+phone,code,LOGIN_CODE_TTL,TimeUnit.MINUTES);
        // 5.发送验证码
        log.debug("发送短信验证码成功,验证码:"+code);
        // 返回ok
        return Result.ok();
    }
    @Override
    public Result login(LoginFormDTO loginForm, HttpSession session){
        // 1.校验手机号
        String phone = loginForm.getPhone();
        if (RegexUtils.isPhoneInvalid(phone)) {
            // 2.如果不符合,返回错误信息
            return Result.fail("手机号格式错误!");
        }
        // 3.从redis获取验证码并校验
        String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
        String code = loginForm.getCode();
        if (cacheCode == null || !cacheCode.toString().equals(code)) {
            // 不一致,报错
            return Result.fail("验证码错误");
        }

        // 4.一致,根据手机号查询用户 select * from tb_user where phone = ?
        User user = query().eq("phone", phone).one();

        // 5.判断用户是否存在
        if (user == null) {
            // 6.不存在,创建新用户并保存
            user =  createUserWithPhone(phone);
        }

        // 7.保存用户信息到 redis中
        // 7.1.随机生成token,作为登录令牌
        String token = UUID.randomUUID().toString();
        // 7.2.将User对象转为HashMap存储
        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
        Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),
                CopyOptions.create()
                        .setIgnoreNullValue(true)
                        .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
        // 7.3.存储
        String tokenKey = LOGIN_USER_KEY + token;
        stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
        // 7.4.设置token有效期
        stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);

        // 8.返回token
        return Result.ok(token);
    }

    private User createUserWithPhone(String phone) {
        User user=new User();
        user.setPhone(phone);
        user.setNickName(USER_NICK_NAME_PREFIX+ RandomUtil.randomString(10));
        save(user);
        return user;
    }
}

我看了数据库,数据库是正确的存储了对应数据的,而浏览器的session中的token也是和我的redis中的token一样的,不知道为什么

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-02 22:04
    关注

    【以下回答由 GPT 生成】

    问题分析: 根据问题描述,我在黑马点评项目中使用了Redis存储登录模块,并且即使将MvcConfig拦截器的代码注释掉,仍然出现了重复登录的情况。现在需要解决这个问题。

    解决方案: 1. 确认登录模块的具体实现。根据问题描述,需要先了解黑马点评项目中使用的Redis存储登录的具体实现方式,包括登录时保存登录信息到Redis中的逻辑以及验证登录状态的逻辑。可查看登录模块的代码片段,确定Redis的使用方式,以及在哪些地方进行了登录状态的检查或保存。

    1. 核对拦截器的注释情况。根据问题描述,已经注释掉了MvcConfig拦截器的代码。确认已经注释掉拦截器的代码片段是否正确,以及是否注释掉了其他可能存在的拦截器。可以检查MvcConfig类中有没有其他可能会导致重复登录的拦截器代码。

    2. 检查登录状态的验证逻辑。登录状态验证的逻辑可能在多个地方进行,如拦截器或者控制器中。根据问题描述,即使注释掉了拦截器的代码,仍然出现了重复登录的情况,说明登录状态的验证逻辑可能还存在于其他地方。需要检查其他可能的代码片段,确认是否有其他地方进行了登录状态的验证,并对其进行调整或者注释掉。

    3. 重复登录的原因分析。根据问题描述,重复登录的情况出现在即使注释掉了拦截器的代码后,可能存在其他的登录逻辑,导致了重复登录。需要对登录模块的逻辑进行分析,查找可能导致重复登录的原因。可能的原因包括多个登录入口、登录信息保存逻辑的问题等。根据具体情况进行调试和分析,找到问题所在。

    4. 对登录逻辑进行调整。根据重复登录的原因分析结果,对登录逻辑进行相应的调整。可以根据具体情况采取以下几种可能的调整方式:

    5. 删除重复登录逻辑:如果在多个地方进行了登录验证,并且同时对用户进行了登录操作,可以从代码中删除重复登录的逻辑,只保留一个登录逻辑。
    6. 调整登录信息保存逻辑:根据重复登录的原因分析,可能是登录信息在保存到Redis时出现了问题。可以检查保存登录信息的代码片段,确保每次登录成功后只保存一次登录信息到Redis中,避免重复保存导致重复登录。

    7. 重新编译运行项目。对登录模块的逻辑进行调整后,重新编译运行项目,观察是否还会出现重复登录的情况。如果问题仍然存在,可以进行调试和排查,查找问题根源,或者通过日志等方式进一步分析问题。

    代码示例: 由于无法获得具体的代码片段,无法给出详细的代码示例。

    回答: 根据目前的问题描述,我无法给出具体的解决方案。需要进一步了解黑马点评项目中Redis存储登录模块的实现以及相关代码片段才能进行具体的问题解决。请提供更多关于问题的上下文或者代码片段,以便我能够更好地帮助您解决这个问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月2日