一、导入黑马点评项目
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登录