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

本文详细描述了黑马点评项目后端部署,包括数据库设置、Redis配置,前端部署使用Nginx,以及短信验证码的生成、验证和登录注册过程。还涉及了登录验证拦截器和集群session共享问题的解决方案,采用Redis实现session存储.
摘要由CSDN通过智能技术生成

一、导入黑马点评项目

1.后端部署

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

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

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

 如下:

使用虚拟机安装redis:

安装依赖:

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

redis默认前台启动:

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

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

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

2.前端部署

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

输入网址:黑马点评

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

二、发送短信验证码

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

    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();
    }

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

    @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登录

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 Redis 实现单点登录的过程如下: 1. 在用户登录成功后,将用户息存储到 Redis 中,并生成一个唯一的 token; 2. 将 token 返回给客户端,并将 token 存储在客户端的 Cookie 中,以便后续请求中使用; 3. 当客户端向服务端发送请求时,服务端读取 Cookie 中的 token,从 Redis 中获取对应的用户息,判断用户是否已经登录; 4. 如果用户已经登录,则服务端继续处理该请求;否则,服务端返回未登录的提示息。 实现单点登录的关键是如何生成并验证 token。一般来说,token 需要满足以下条件: 1. 具有一定的复杂度和随机性,以保证不可被猜测; 2. 与具体用户相关,以便在服务端验证用户的登录状态。 一个常用的方法是使用 JWT( JSON Web Token)作为 token。JWT 是一种开放的标准,用于在各方之间安全地传输息,包括用户身份息。JWT 通常由三部分构成,分别是头部(Header)、载荷(Payload)和签名(Signature)。 在单点登录的场景中,JWT 的 Payload 可以携带用户的基本息,例如用户名、用户ID、用户角色等。然后,服务端使用一个密钥对 Payload 进行签名,生成最终的 JWT。客户端在后续请求中,携带 JWT,服务端可以根据密钥验证 JWT,从而判断用户是否已经登录。 通过使用 JWT,可以实现跨系统的单点登录,同时也可以大大简化服务端的状态管理,提高系统的可扩展性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Buuuleven.(程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值