【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解

一. 黑马点评Redis项目实践

1.1开发环境搭建

1.课程介绍:

image-20230310093159781

2.数据库:

image-20230310100434653

image-20230310095932455

3.项目架构:

image-20230310100014091

1.1.1 数据库

MySQL数据库,版本8.0

导入sql文件即可:

image-20230310103004197

1.1.2 Springboot项目

将项目文件放到idea目录下:

image-20230310140858024

加入SpringBoot启动器:

image-20230310140923127

启动项目:

访问目录:

http://localhost:8081/shop-type/list

结果如下,将数据库里的值取出:

image-20230310141032774

1.1.3 前端配置

image-20230310141215512

在改目录下,进入终端:输入命令:

start nginx.exe

image-20230310141559261

访问目录:

http://localhost:8080/

image-20230310141701368

1.2 基于session实现登录

image-20230310142802585

1.2.1 发送短信验证码

思路如下:

image-20230310143024480

TODO 发送短信验证码并保存验证码

return userService.sendCode(phone,session);

IUserService:

public interface IUserService extends IService<User> {
    Result sendCode(String phone, HttpSession session);
}

UserServiceImpl:

校验手机号:

if (RegexUtils.isPhoneInvalid(phone)){
    //2.如果不符合,返回错误信息
    return Result.fail("手机号格式错误");
}

符合,生成验证码

String code =RandomUtil.randomNumbers(6);

保存验证码到session

session.setAttribute("code",code);

因为目前在测试阶段,没有申请阿里云的短信服务,故用日志替代:

发送验证码

log.debug("发送验证码成功,验证码{{}}",code);

测试:

image-20230310212211524

查看日志:

image-20230310212224194

1.2.2 短信验证码登录

短信验证码登录思路:

image-20230310212944444

登录功能:登录参数,包含手机号、验证码;或者手机号、密码

TODO 实现登录功能:

return userService.login(loginForm,session);

login登录功能:

Result login(LoginFormDTO loginForm, HttpSession session);

UserServiceImpl:

校验手机号:

String phone = loginForm.getPhone();
if (RegexUtils.isPhoneInvalid(phone)){
    //2.如果不符合,返回错误信息
    return Result.fail("手机号格式错误");
}

效验验证码:

Object cacheCode=session.getAttribute("code");
String code = loginForm.getCode();
        if (cacheCode == null || !cacheCode.toString().equals(code)){
            //3.不一致,报错
            return Result.fail("验证码错误");
        }

一致根据手机号查询用户:

User user =query().eq("phone",phone).one();

判断用户是否存在

if (user == null){
    //6.不存在,创建新用户并且保存
    user = createWithPhone(phone);
}

保存用户信息到session中

session.setAttribute("user",user);

返回Result.ok()

return Result.ok();

createWithPhone,功能为:创建新用户

创建也会有:给一个随机的用户名:

User user = new User();
user.setPhone(phone);
user.setNickName("user_"+RandomUtil.randomNumbers(10));

保存用户:

save(user);
return user;

重新启动项目,填入手机号和验证码进行测试,测试结果如下:

填入一个错误的验证码:

image-20230310215836721

image-20230310215852564

填入正确的验证码:

image-20230310215915244

进入数据库查看:

image-20230310220025385

1.2.3 登录验证功能

思路:使用拦截器

image-20230310220335716

1.2.3.1 编写拦截器

新建立:Loginlnterceptor

1.获取session

HttpSession session = request.getSession();

2.获取session中的用户

Object user = session.getAttribute("user");

3.判断用户是否存在

if(user == null){
    //4.不存在,拦截,返回401代码
    response.setStatus(401);
    return false;
}

5.存在,保存用户信息到ThreadLocal

UserHolder.saveUser((User) user);

6.放行

return true;

7.移出

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    UserHolder.removeUser();
}

编写MvcConfig:

配置过滤器:

@Override
public void addInterceptors(InterceptorRegistry registry){
    registry.addInterceptor(new Loginlnterceptor())
            .excludePathPatterns(
                    "/shop/**",
                    "/voucher/**",
                    "/shop-type/**",
                    "/upload/**",
                    "/user/code",
                    "/blog/hot",
                    "/user/login"
            );
}

重新启动:效果如下

image-20230311122937814

总结

这篇文章详细介绍了一个基于SpringBoot和MySQL的Redis项目实践,涵盖了从开发环境搭建到具体功能实现的全过程。文章分为以下几个主要部分:

  1. 开发环境搭建

    • 通过MySQL数据库的配置,导入SQL文件实现数据的初始化。
    • 搭建SpringBoot项目并成功加载数据,确保后端服务正常运行。
    • 配置前端Nginx服务器,确保前端页面可以正常访问。
  2. 基于Session的登录功能实现

    • 文章通过发送短信验证码来验证用户的身份,并将验证码保存到Session中,以保证验证码的有效性。
    • 实现了短信验证码登录的功能,验证手机号和验证码是否一致,成功登录后保存用户信息到Session。
    • 使用拦截器确保需要登录的请求能够进行身份验证,若未登录则拦截并返回401状态码。
  3. 技术细节与亮点

    • 详细讲解了如何生成验证码并将其保存到Session,如何验证用户的登录状态,确保用户体验。
    • 利用Spring拦截器进行了登录状态的全局验证,确保需要身份验证的接口在没有登录状态的情况下无法访问。

总结来说,这篇文章提供了一个完整的示例,展示了如何在SpringBoot项目中实现基于Session的登录系统,配合短信验证码实现了简单但高效的用户验证机制,能够帮助读者理解并掌握相关技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一键难忘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值