黑马点评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登录

相关推荐
●VON2 分钟前
React Native for OpenHarmony:2048 小游戏的开发与跨平台适配实践
javascript·学习·react native·react.js·von
顾北124 分钟前
MCP服务端开发:图片搜索助力旅游计划
java·spring boot·dubbo
我命由我1234511 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
ZH154558913111 分钟前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
赛姐在努力.12 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
yxc_inspire16 分钟前
Java学习第二天
java·面向对象
毕设源码-赖学姐18 分钟前
【开题答辩全过程】以 基于net超市销售管理系统为例,包含答辩的问题和答案
java
昀贝28 分钟前
IDEA启动SpringBoot项目时报错:命令行过长
java·spring boot·intellij-idea
xcLeigh28 分钟前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh29 分钟前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics