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

相关推荐
夜郎king几秒前
基于 Java 实现数九天精准计算:从节气算法到工程化落地
java·开发语言
新缸中之脑2 分钟前
Nanobot:轻量级OpenClaw
java·运维·网络
悟能不能悟6 分钟前
java.sql.SQLSyntaxErrorException: ORA-01031: insufficient privileges
java·开发语言
马猴烧酒.7 分钟前
【DDD重构|第十三天】DDD 领域驱动设计详解+实战
java·jvm·ide·重构·tomcat·maven·团队开发
知识分享小能手10 分钟前
SQL Server 2019入门学习教程,从入门到精通,初识 SQL Server 2019 —— 语法知识点与使用方法详解(1)
数据库·学习·sqlserver
代码游侠12 分钟前
C语言核心概念复习(三)
开发语言·数据结构·c++·笔记·学习·算法
烧烧的酒0.o13 分钟前
Java——JavaSE完整教程
java·开发语言·学习
嗯嗯**19 分钟前
Neo4j学习4:数据导入
学习·neo4j·图数据库·csv·数据导入
鹏哥哥啊Aaaa19 分钟前
15.idea启动报错
java·ide·intellij-idea
super_lzb21 分钟前
VUE 请求代理地址localhost报错[HPM] Error occurred while trying to proxy request
java·spring·vue·springboot·vue报错