一、功能描述
① 访问登录页面:点击顶部区域内的链接,打开登录页面。
② 登录:验证账号、密码、验证码;成功时,生成登录凭证,发送给客户端;失败时,跳转回登录页。
③ 退出:将登录凭证修改为失效状态;跳转至网站首页。
④ 忘记密码: 点击登录页面上的“忘记密码”链接,打开忘记密码页面;在表单中输入注册的邮箱,点击获取验证码按钮,服务器为该邮箱发送一份验证码;在表单中填写收到的验证码及新密码,点击重置密码,服务器对密码进行修改。
二、登录、退出
LoginController.java
@PostMapping("/login")
public String login(String username, String password, String code, boolean rememberme,
Model model, HttpSession session, HttpServletResponse response) {
// 检查验证码
String kaptcha = (String) session.getAttribute("kaptcha");
if (StringUtils.isBlank(kaptcha) || StringUtils.isBlank(code) || !kaptcha.equalsIgnoreCase(code)) {
model.addAttribute("codeMsg", "验证码不正确!");
return "/site/login";
}
// 检查账号,密码
int expiredSeconds = rememberme ? REMEMBER_EXPIRED_SECONDS : DEFAULT_EXPIRED_SECONDS;
Map<String, Object> map = userService.login(username, password, expiredSeconds);
if (map.containsKey("ticket")) {
Cookie cookie = new Cookie("ticket", map.get("ticket").toString());
cookie.setPath(contextPath);
cookie.setMaxAge(expiredSeconds);
response.addCookie(cookie);
return "redirect:/index";
} else {
model.addAttribute("usernameMsg", map.get("usernameMsg"));
model.addAttribute("passwordMsg", map.get("passwordMsg"));
return "/site/login";
}
}
@GetMapping("/logout")
public String logout(@CookieValue("ticket") String ticket) {
userService.logout(ticket);
return "redirect:/login";
}
UserService.java
public Map<String, Object> login(String username, String password, int expiredSeconds) {
Map<String, Object> map = new HashMap<>();
// 空值处理
if (StringUtils.isBlank(username)) {
map.put("usernameMsg", "