- 注册思路:填写注册表单,向用户发送邮箱,点击邮箱中的激活链接激活账号,提示激活成功并跳转至首页。
核心代码如下,若存在不合理信息,则将错误提示封装至map中。在controller中通过判断返回的map是否为空,以及map中的值判断数据和合理性,并返回给界面,显示错误信息。map不为空时,生成激活码,作为激活链接中的参数,并验证激活码是否正确。service核心方法如下。
1 public Map<String, Object> register(User user) { 2 Map<String, Object> map = new HashMap<>(); 3 4 // 空值处理 5 if (user == null) { 6 throw new IllegalArgumentException("参数不能为空!"); 7 } 8 if (StringUtils.isBlank(user.getUsername())) { 9 map.put("usernameMsg", "账号不能为空!"); 10 return map; 11 } 12 if (StringUtils.isBlank(user.getPassword())) { 13 map.put("passwordMsg", "密码不能为空!"); 14 return map; 15 } 16 if (StringUtils.isBlank(user.getEmail())) { 17 map.put("emailMsg", "邮箱不能为空!"); 18 return map; 19 } 20 21 // 验证账号 22 User u = userMapper.selectByName(user.getUsername()); 23 if (u != null) { 24 map.put("usernameMsg", "该账号已存在!"); 25 return map; 26 } 27 28 // 验证邮箱 29 u = userMapper.selectByEmail(user.getEmail()); 30 if (u != null) { 31 map.put("emailMsg", "该邮箱已被注册!"); 32 return map; 33 } 34 35 // 注册用户 36 user.setSalt(CommunityUtil.generateUUID().substring(0, 5)); 37 user.setPassword(CommunityUtil.md5(user.getPassword() + user.getSalt())); 38 user.setType(0); 39 user.setStatus(0); 40 user.setActivationCode(CommunityUtil.generateUUID()); 41 user.setHeaderUrl(String.format("http://images.nowcoder.com/head/%dt.png", new Random().nextInt(1000))); 42 user.setCreateTime(new Date()); 43 userMapper.insertUser(user); 44 45 // 激活邮件 46 Context context = new Context(); 47 context.setVariable("email", user.getEmail()); 48 // http://localhost:8080/community/activation/101/code 49 String url = domain + contextPath + "/activation/" + user.getId() + "/" + user.getActivationCode(); 50 context.setVariable("url", url); 51 String content = templateEngine.process("/mail/activation", context); 52 mailClient.sendMail(user.getEmail(), "激活账号", content); 53 54 return map; 55 }
通过JavaMailSender包实现了发送邮件功能时,有个细节要注意,配置类中的password不是邮箱密码,而是邮箱授权码!
- 登录思路:通过Kaptcha实现验证码的生成,通过图片流将图片返回给浏览器,将验证码数字存入Session。登录时进行验证。新建LoginTicket类用来存储用户id,登录凭证号(UUID),目的是将uuid存入Cookie,方便其他模块获取当前登录用户信息。
1 @RequestMapping(path = "/login", method = RequestMethod.POST) 2 public String login(String username, String password, String code, boolean rememberme, 3 Model model, HttpSession session, HttpServletResponse response) { 4 // 检查验证码 5 String kaptcha = (String) session.getAttribute("kaptcha"); 6 if (StringUtils.isBlank(kaptcha) || StringUtils.isBlank(code) || !kaptcha.equalsIgnoreCase(code)) { 7 model.addAttribute("codeMsg", "验证码不正确!"); 8 return "/site/login"; 9 } 10 11 // 检查账号,密码 12 int expiredSeconds = rememberme ? REMEMBER_EXPIRED_SECONDS : DEFAULT_EXPIRED_SECONDS; 13 Map<String, Object> map = userService.login(username, password, expiredSeconds); 14 if (map.containsKey("ticket")) { 15 Cookie cookie = new Cookie("ticket", map.get("ticket").toString()); 16 cookie.setPath(contextPath); 17 cookie.setMaxAge(expiredSeconds); 18 response.addCookie(cookie); 19 return "redirect:/index"; 20 } else { 21 model.addAttribute("usernameMsg", map.get("usernameMsg")); 22 model.addAttribute("passwordMsg", map.get("passwordMsg")); 23 return "/site/login"; 24 } 25 }
public Map<String, Object> login(String username, String password, int expiredSeconds) { Map<String, Object> map = new HashMap<>(); // 空值处理 if (StringUtils.isBlank(username)) { map.put("usernameMsg", "账号不能为空!"); return map; } if (StringUtils.isBlank(password)) { map.put("passwordMsg", "密码不能为空!"); return map; } // 验证账号 User user = userMapper.selectByName(username); if (user == null) { map.put("usernameMsg", "该账号不存在!"); return map; } // 验证状态 if (user.getStatus() == 0) { map.put("usernameMsg", "该账号未激活!"); return map; } // 验证密码 password = CommunityUtil.md5(password + user.getSalt()); if (!user.getPassword().equals(password)) { map.put("passwordMsg", "密码不正确!"); return map; } // 生成登录凭证 LoginTicket loginTicket = new LoginTicket(); loginTicket.setUserId(user.getId()); loginTicket.setTicket(CommunityUtil.generateUUID()); loginTicket.setStatus(0); loginTicket.setExpired(new Date(System.currentTimeMillis() + expiredSeconds * 1000)); loginTicketMapper.insertLoginTicket(loginTicket); map.put("ticket", loginTicket.getTicket()); return map; }