结论:HttpSession类的对象session更像是独属于某一个用户的小型数据库,数据库的密码就是前端传回来的JSESSIONID的值
public Result sendCode(String phone, HttpSession session) {
//1.校验手机号
if(RegexUtils.isPhoneInvalid(phone)){
//2.如果不符合,返回错误信息
return Result.fail("手机号格式错误!");
}
//3.生成验证码
String code = RandomUtil.randomNumbers(6);//337718
//4.保存验证码到session
session.setAttribute("code",code);//337718
//5.发送验证码
log.debug("发送短信验证码成功,验证码:{}",code);
//6.返回ok
return Result.ok();
}
public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session) {
//1.校验手机号
String phone = loginForm.getPhone();
if(RegexUtils.isPhoneInvalid(phone)){
//2.如果不符合,返回错误信息
return Result.fail("手机号格式错误!");
}
//2.校验验证码
Object cacheCode = session.getAttribute("code");//保存的337718
String code = loginForm.getCode();//用户刚刚在http请求里体里上传的验证码
//3.验证码不一致,报错
//4.一致根据手机号查询用户
//5.判断用户是否存在
//6.不存在,创建新用户并保存
//7.保存用户到session并返回结果
return null;
}
在sendCode()方法中保存验证码到session,我没看到session没有传递给login()方法,所以login()方法里的session.getAttribute("code")是怎么拿到保存的验证码的呢?
答:
由于 HttpSession 是基于会话的,同一个用户的多次请求会共享同一个 HttpSession 对象,因此 login()方法可以通过 session.getAttribute("code") 获取到之前保存的验证码。
具体来说,sendCode 和 login 方法都接收 HttpSession 作为参数,Spring 框架会自动将同一个用户的 HttpSession 对象传递给这两个方法。因此,login 方法可以通过 session.getAttribute("code") 获取到 sendCode 方法中保存的验证码。
Spring 框架是怎么识别各个请求是否为同一个用户?
用户在点击发送验证码按键的时候,前端会在请求头里请求服务器设置JSESSIONID
服务器的response Headers里就会返回set-cookie,前端自动保存这个JSESSIONID,之后每次请求都会在请求头里带上这个JSESSIONID,Spring 框架会自动将同一个JSESSIONID的请求视为同一个用户。
set-cookie:JSESSIONID=F3EAFF14FBC9A909286D915BD961630E; Path=/; HttpOnly