解决前后端发送验证码手机号登陆的sessionId不一致问题

前端:鸿蒙开发ArkTs语言
后端:spring boot mybatis-plus框架

后端代码

 @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpServletRequest request, HttpServletResponse response) {
   
   
        // 从User对象中提取用户手机号
        String phone = user.getPhone();
        // 验证手机号是否不为空
        if (StringUtils.isNotEmpty(phone)) {
   
   
            // 生成4位随机验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();

            // 获取或创建Session,并获取Session ID
            HttpSession session = request.getSession(true);
            String sessionId = session.getId();
            // 发送短信验证码,使用第三方服务或API
            SMSUtils.sendMessage("鸿蒙开发", "SMS_475965454", phone, code);

            // 将验证码存储在Session中,以便后续验证
            session.setAttribute("SMS_CODE_" + phone, code);
            // 设置Session的超时时间为300秒(5分钟)
            session.setMaxInactiveInterval(300);

            // 记录日志,包含手机号、验证码和Session ID
            log.info("Stored code in session - Phone: {}, Code: {}, SessionId: {}",
                    phone, code, sessionId);

            // 创建JSESSIONID Cookie,用于维持会话状态
            Cookie cookie = new Cookie("JSESSIONID", sessionId);
            // 设置Cookie的路径,使得整个应用都可以访问该Cookie
            cookie.setPath("/");
            // 设置Cookie的HttpOnly属性为true,增加安全性
            cookie.setHttpOnly(true);
            // 将Cookie添加到响应中
            response.addCookie(cookie);

            // 返回成功的响应,表示短信验证码已发送
            return R.success("手机验证码短信发送成功");
        }
        // 如果手机号为空,返回失败的响应
        return R.error("发送失败");
    }



    /**
     * 处理手机号验证码登录的请求。
     * 该方法处理HTTP POST请求到"/loginByPhone"路径,接收登录参数和HTTP会话,返回登录结果。
     *
     * @param map 包含登录参数的Map对象,其中应包含手机号和验证码。
     * @param session HTTP会话对象,用于验证验证码和存储用户信息。
     * @return R<User> 封装了登录结果的响应对象,包含登录成功或失败的信息。
     */
    @PostMapping("/loginByPhone")
    public R<User> loginByPhone(@RequestBody Map<String, String> map, HttpSession session) {
   
   
        // 从请求体中提取手机号和验证码
        String phone = map.get("phone");
        String code = map.get("code");
        // 记录尝试登录的日志信息
        log.info("Attempting phone login - Phone: {}, Input Code: {}", phone, code);

        // 1. 验证手机号和验证码非空
        // 检查手机号和验证码是否为空,如果为空返回错误信息
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) {
   
   
            return R.error("手机号或验证码不能为空");
        }

        // 2. 验证码校验
        // 从会话中获取与手机号关联的验证码
        Object codeInSession = session.getAttribute("SMS_CODE_" + phone);
        // 记录验证码校验的日志信息
        log.info("Phone: {}, Input Code: {}, Stored Code: {}", phone, code, codeInSession);

        // 检查会话中是否存在验证码,如果不存在返回验证码过期的错误信息
        if (codeInSession == null) {
   
   
            log.warn("No verification code found in session for phone: {}", phone);
            return R.error("验证码已过期,请重新获取");
        }

        // 比较输入的验证码和会话中存储的验证码,如果不一致返回验证码错误信息
        if (!codeInSession.toString(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值