前端:鸿蒙开发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(

最低0.47元/天 解锁文章
3051

被折叠的 条评论
为什么被折叠?



