基于Session实现登录流程
发送验证码:
用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号
如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户
短信验证码登录、注册:
用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后和用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号查询用户,如果用户不存在,则为用户创建账号信息,保存到数据库,无论是否存在,都会将用户信息保存到session中,方便后续获得当前登录信息
校验登录状态:
用户在请求时候,会从cookie中携带者JsessionId到后台,后台通过JsessionId从session中拿到用户信息,如果没有session信息,则进行拦截,如果有session信息,则将用户信息保存到threadLocal中,并且放行
![](/../images/redis/r6.png)
具体代码如下
1. 发送验证码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Override public Result sendCode(String phone, HttpSession session) { if (RegexUtils.isPhoneInvalid(phone)) { return Result.fail("手机号格式错误!"); } String code = RandomUtil.randomNumbers(6);
session.setAttribute("code",code); System.out.println("发送短信验证码成功,验证码:"+ code); return Result.ok(); }
|
2. 登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @Override public Result login(LoginFormDTO loginForm, HttpSession session) { String phone = loginForm.getPhone(); if (RegexUtils.isPhoneInvalid(phone)) { return Result.fail("手机号格式错误!"); } Object cacheCode = session.getAttribute("code"); String code = loginForm.getCode(); if(cacheCode == null || !cacheCode.toString().equals(code)){ return Result.fail("验证码错误"); } User user = query().eq("phone", phone).one();
if(user == null){ user = createUserWithPhone(phone); } session.setAttribute("user",user);
return Result.ok(); }
|
3. 实体类User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("tb_user") public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO) private Long id;
private String phone;
private String password;
private String nickName;
private String icon = "";
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
|
4. 系统常量类SystemConstants.java
1 2 3 4 5 6 7 8 9
| package com.hmdp.utils;
public class SystemConstants { public static final String IMAGE_UPLOAD_DIR = "D:\\lesson\\nginx-1.18.0\\html\\hmdp\\imgs\\"; public static final String USER_NICK_NAME_PREFIX = "user_"; public static final int DEFAULT_PAGE_SIZE = 5; public static final int MAX_PAGE_SIZE = 10; }
|
运行截图:
从后台获取验证码输入到前端页面上
![](/../images/redis/r10.png)
登录界面:
![](/../images/redis/r30.png)
登录成功:
但是这有一个小bug,即登录之后会刷新页面,因为是先弄了拦截器,不让直接访问,留下一篇解决
![](/../images/redis/r9.png)
注意: 一开始发送短信验证码的时候要跟后来登录时候的手机号一致,否则会登录失败。