day30 黑马点评短信登录与Session实现

1. 今天做了什么

  • 导入黑马点评项目

  • 短信登录业务

    • 发送短信验证码

    • 验证码登录

    • 校验登录状态

  • 基于 Session 实现登录

  • 登录校验的实现

  • Session 数据共享问题分析(引出 Redis 方案,今日未实现)

今天只学了这些代码,没学具体怎样使用。

2. 核心知识点

2.1 MyBatis-Plus 快捷操作

操作数据库可以使用 MyBatis-Plus 实现快捷操作,不用写 Mapper 层。

常用方法:query()、save(user)。

查询用户:

1
2
3
4
5
6
// 查询用户
User user = query().eq("phone", phone).one();
if(user == null){
//创建用户
user = createUserWithPhone(phone);
}

自动创建用户:

1
2
3
4
5
6
7
8
9
10
11
private User createUserWithPhone(String phone) {
User user = new User();
user.setPhone(phone);
user.setNickName("user_"+RandomUtil.randomString(10));

//保存用户
save(user);

//返回用户
return user;
}

使用该注解可以在 save(user) 时将数据库生成的主键 id 返回到 user 对象:

1
2
3
4
5
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;

2.2 登录校验

  • 拦截器实现登录校验

  • 使用 ThreadLocal 保存用户信息

2.3 UserDTO

使用 UserDTO:在存储用户信息、响应前端时

  • 可以避免敏感信息返回前端

  • 可以节省内存

User 转 UserDTO 的两个办法,今天学到 BeanUtil.copyProperties((User)user, UserDTO.class) 写法。注意一个是 BeanUtils,另一个是 BeanUtil:

1
2
3
//        UserDTO userDTO = new UserDTO();
// BeanUtils.copyProperties(user,userDTO);
UserHolder.saveUser(BeanUtil.copyProperties((User)user,UserDTO.class));

3. 深度思考

对 Session 的理解

  • 每个服务器有 Session 池

  • 浏览器请求后,设置 session 的时候传入字段名与字段值

  • 为该浏览器生成 SessionID,生成 Session 对象,将字段名与字段值存入

  • 下次请求

4. 踩过的坑

5. 遗留问题 / 想不通

Session 数据共享问题

  • 每个服务器的 session 是独立的

  • 可以数据共享,但是存在延迟

如何解决

可以用 Redis 来实现登录,今日学习到此结束,Redis 的实现明日再学。