用户注册及登录功能

  • 注册思路:填写注册表单,向用户发送邮箱,点击邮箱中的激活链接激活账号,提示激活成功并跳转至首页。

核心代码如下,若存在不合理信息,则将错误提示封装至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;
        }

猜你喜欢

转载自www.cnblogs.com/zhangbochao/p/12411360.html