具体流程是 点击上面的登陆按钮进入登陆页面,输入用户名、密码和验证码点击登陆成功后进入主页,错误会返回错误信息,点击用户头像可以退出用户。在登陆页面可以点击忘记密码进入修改密码页面,通过向注册邮箱发送存有验证码的链接可以修改密码。
数据访问层
LoginTicket实体类定义访问凭证的各个参数
LoginTicketMapper接口实现查询凭证、插入凭证、修改凭证状态的方法
业务层
UserService实现登陆方法
判断输入的用户名、密码是否为空,判断用户名是否正确,判断账号是否已激活,判断密码是否正确,如果以上全部没问题,就可以生成登陆凭证。
其中如果报错把错误信息存到map里直接返回map就可
public void logout(String ticket){
loginTicketMapper.updateStatus(ticket,1);
}
退出方法↑
表现层
LoginController
进入登陆页面
登录按钮的路径方法
@RequestMapping(path = "/login" ,method = RequestMethod.POST)
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 ? REMEMEBER_EXPIRED_SECONDS : DEFALUT_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";
}
}
首先判断验证码是否正确,通过HttpSession存的kaptcha参数存的验证码与输入的验证码对比
然后判断账号密码是否正确,通过业务层已经定义的登陆方法,判断是否包含正确的那个键值对,如果包含就可以重定向到主页了
@RequestMapping(path = "/logout" ,method = RequestMethod.GET)
public String logout(@CookieValue("ticket") String ticket){
userService.logout(ticket);
return "redirect:/login";
}
退出方法↑
login.html
登陆页面加上thymeleaf模板引擎,输入的文本框的值动态取request里的值,因为如果有错误信息返回登录页面的话不会丢失之前填写的内容
th:value="${param.xxxxxx}" == request.getparameter("username")
th:href="@{/logout}"可以实现退出