黑马点评Redis项目实战(1)基于Session实现短信登录

一、导入黑马点评项目

1.后端部署

下载好资料之后,先在数据库中制作所需的表,如下:

接着在工程中按照自己的数据库设置相应的username和root,如下:

启动项目之后,输入网站:localhost:8081/shop-type/list

如下:

使用虚拟机安装redis:

安装依赖:

上传压缩包到指定文件夹:

redis默认前台启动:

redis后台启动(指定配置启动):

修改工程中有关redis的ip地址、端口号、密码等信息:

此时,后端项目部署已经完成。

2.前端部署

解压资料中的ngix压缩包,复制到一个没有中文路径的目录,启动即可。

输入网址:黑马点评

选择手机模式即可看到如下页面

二、发送短信验证码

重点思路绘制出流程图,理清思路:

java 复制代码
    public Result sendCode(String phone, HttpSession session) {
        //1.校验手机号
        if (RegexUtils.isPhoneInvalid(phone)){
            //2.如果不符合,返回错误信息
            return Result.fail("手机号格式错误");
        }
        //3.符合,生成验证码
        String code = RandomUtil.randomNumbers(6);//hutool工具包生成随机6位数
        //4.保存验证码到session
        session.setAttribute("code", code);
        //5.发送验证码 //需要调用第三方平台,比如阿里云短信平台实现,实现起来比较复杂,此处假设发送成功
        log.debug("发送短信验证码成功,验证码:{}", code);
        //返回ok
        return Result.ok();
    }

三、短信验证码登录和注册

java 复制代码
    @Override
    public Result login(LoginFormDTO loginForm, HttpSession session) {
        //1.再次校验手机号
        String phone = loginForm.getPhone();
        if (RegexUtils.isPhoneInvalid(phone)){
            return Result.fail("手机号格式错误");
        }
        //2.校验验证码
        Object cacheCode = session.getAttribute("code");//存在session中的验证码
        String code = loginForm.getCode();//从前端获取的验证码
        if (cacheCode == null || !cacheCode.toString().equals(code)){
            //3.不一致,报错
            return Result.fail("验证码错误");
        }
        //4.一致,根据手机号查询用户
        // query()(是ServiceImpl<UserMapper, User>中mybatis的一个方法)=select * from tb_user where phone = ?
        User user = query().eq("phone", phone).one();
        //5.判断用户是否存在
        if (user == null){
            //6.不存在:创建新用户,并保存
            user = createUserWithPhone(phone);
        }
        //7.保存用户信息到session(存在不存在都要进行这一步)
        session.setAttribute("user", user);
        return Result.ok();
    }

    private User createUserWithPhone(String phone) {
        //1.创建用户
        User user = new User();
        user.setPhone(phone);
        user.setNickName(USER_NICK_NAME_PREFIX + RandomUtil.randomString(5));
        //USER_NICK_NAME_PREFIX在SystemConstants里的常量
        //2.保存用户
        save(user);//mybatis的函数
        return user;
    }

四、登录验证功能

1.拦截器

编写拦截器(utils)==》配置拦截器生效(config)

@Configuration:表示MVC相关配置的注解

2.敏感信息泄露

User类会有敏感信息泄露的风险,所以改为UserDTO类。

此时就只能看到三个信息,没有密码等其他敏感信息了。

五、集群的session共享问题

**session共享问题:**多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。

session的代替方案应该满足:

  • 数据共享
  • 内存存储
  • key, value结构

所以引入Redis实现session登录

相关推荐
28岁青春痘老男孩7 小时前
JDK8+SpringBoot2.x 升级 JDK 17 + Spring Boot 3.x
java·spring boot
方璧7 小时前
限流的算法
java·开发语言
元Y亨H7 小时前
Nacos - 服务注册
java·微服务
曲莫终7 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
ruleslol7 小时前
MySQL的段、区、页、行 详解
数据库·mysql
天若有情6737 小时前
校园二手交易系统实战开发全记录(vue+SpringBoot+MySQL)
vue.js·spring boot·mysql
xiaobai1787 小时前
测试工程师入门AI技术 - 前序:跨越焦虑,从优势出发开启学习之旅
人工智能·学习
一心赚狗粮的宇叔7 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
北岛寒沫7 小时前
北京大学国家发展研究院 经济学原理课程笔记(第二十一课 金融学基础)
经验分享·笔记·学习
奋进的芋圆8 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端