数据层
忘记密码涉及到的是用户密码的更改。就是password的update。
- dao的操作
在dao包下编写 UserMapper 的接口代码,增加一个updatePassword()。
- 在 mapper 下实现这个方法的xml,写 SQL。
<update id="updatePassword">
update user set password = #{password} where email = #{email}
</update>
service层
service 层主要实现2个功能:1.给邮箱发送验证码。 2.重置密码.
- 给邮箱发送验证码:
- 空值判断。
- 验证该邮箱是否存在数据库。
- 验证该邮箱的状态是否正常/激活。
- 都没问题的话就给邮箱发送验证码。
public Map<String, Object> getCode(String email) {
Map<String,Object> map = new HashMap<>();
//空值判断
if (StringUtils.isBlank(email)){
map.put("emailMsg","请输入邮箱!");
return map;
}
//邮箱是否正确
User user = userMapper.selectByEmail(email);
if (user == null){
map.put("emailMsg","该邮箱还未注册过,请注册后再使用!");
return map;
}
//该用户还未激活
if (user.getStatus() == 0){
map.put("emailMsg","该邮箱还未激活,请到邮箱中激活后再使用!");
return map;
}
//邮箱正确的情况下,发送验证码到邮箱
Context context = new Context();
context.setVariable("email",email);
String code = CommunityUtil.generateUUID().substring(0,5);
context.setVariable("code",code);
String content = templateEngine.process("mail/forget", context);
mailClient.sendMail(email, "验证码", content);
map.put("code",code);//map中存放一份,为了之后和用户输入的验证码进行对比
map.put("expirationTime", LocalDateTime.now().plusMinutes(5L));//过期时间
return map;
}
- 重置密码:
- 空值判断。
- 更改的密码加盐再md5加密存于数据库。
- 往 userMapper 中存新的密码。
public Map<String, Object> forget(String email, String verifycode, String password){
Map<String,Object> map = new HashMap<>();
//空值处理
if (StringUtils.isBlank(email)){
map.put("emailMsg","请输入邮箱!");
return map;
}
if (StringUtils.isBlank(verifycode)){
map.put("codeMsg","请输入验证码!");
return map;
}
if (StringUtils.isBlank(password)){
map.put("passwordMsg","请输入新密码!");
return map;
}
//邮箱在获取验证码那一步已经验证过了,是有效的邮箱,且验证码也有效
User user = userMapper.selectByEmail(email);
password = CommunityUtil.md5(password + user.getSalt());
userMapper.updatePassword(String.valueOf(user.getId()),password);
return map;
}
controller层
1.用户点‘忘记密码’超链后跳转到重设密码的页面。
2. 实现获取验证码的方法,调用 Service 层获取验证码(底层实现了发送邮件的功能); 如果有错误信息,错误信息显示给客户端;如果没有错误信息,告诉客户端验证码已发送的消息; 同时将验证码和过期时间记录在 session 中,以便后续和用户输入的信息作比较。
3. 验证验证码是否正确,是否过期。
- 跳转到忘记密码页面
@RequestMapping(path = "/forget" , method = RequestMethod.GET)
public String getForget(Model model){
return "/site/forget";
}
- 给用户邮箱发送验证码:
@RequestMapping(path = "/getCode", method = RequestMethod.GET)
public String getCode(String email, Model model,HttpSession session) {
Map<String, Object> map = forgetService.getCode(email);
if (map.containsKey("emailMsg")) {//有错误的情况下
model.addAttribute("emailMsg", map.get("emailMsg"));
} else {//正确的情况下,向邮箱发送了验证码
model.addAttribute("msg", "验证码已经发送到您的邮箱,5分钟内有效!");
//将验证码存放在 session 中,后序和用户输入的信息进行比较
session.setAttribute("code",map.get("code"));
//后序判断用户输入验证码的时候验证码是否已经过期
session.setAttribute("expirationTime",map.get("expirationTime"));
}
return "site/forget";
}
- 重置密码:
@RequestMapping(path = "/forget", method = RequestMethod.POST)
public String forget(Model model, String email, String verifycode, String password, HttpSession session) {
//验证验证码是否正确
if (!verifycode.equals(session.getAttribute("code"))) {
model.addAttribute("codeMsg", "输入的验证码不正确!");
return "site/forget";
}
//验证码是否过期
if (LocalDateTime.now().isAfter((LocalDateTime) session.getAttribute("expirationTime"))) {
model.addAttribute("codeMsg", "输入的验证码已过期,请重新获取验证码!");
return "site/forget";
}
Map<String, Object> map = forgetService.forget(email, verifycode, password);
if (map == null || map.isEmpty()) {
model.addAttribute("msg", "密码修改成功,可以使用新密码登录了!");
model.addAttribute("target", "/login");
return "site/operate-result";
} else {
model.addAttribute("emailMsg", map.get("emailMsg"));
model.addAttribute("codeMsg", map.get("codeMsg"));
model.addAttribute("passwordMsg", map.get("passwordMsg"));
return "/site/forget";
}
}