【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

猜你喜欢

转载自blog.csdn.net/weixin_52908342/article/details/129461867