文章目录
一. 黑马点评Redis项目实践
1.1开发环境搭建
1.课程介绍:
2.数据库:
3.项目架构:
1.1.1 数据库
MySQL数据库,版本8.0
导入sql文件即可:
1.1.2 Springboot项目
将项目文件放到idea目录下:
加入SpringBoot启动器:
启动项目:
访问目录:
http://localhost:8081/shop-type/list
结果如下,将数据库里的值取出:
1.1.3 前端配置
在改目录下,进入终端:输入命令:
start nginx.exe
访问目录:
http://localhost:8080/
1.2 基于session实现登录
1.2.1 发送短信验证码
思路如下:
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);
测试:
查看日志:
1.2.2 短信验证码登录
短信验证码登录思路:
登录功能:登录参数,包含手机号、验证码;或者手机号、密码
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;
重新启动项目,填入手机号和验证码进行测试,测试结果如下:
填入一个错误的验证码:
填入正确的验证码:
进入数据库查看:
1.2.3 登录验证功能
思路:使用拦截器
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"
);
}
重新启动:效果如下