JavaMail之-通过邮件激活账号

关键点就在于:

根据用户的给出的email,给这个email发送一个邮件。这个邮件中应该带有一个激活码?(32位UUID,64位UUID)。

大概步骤:

1,  注册功能 - 只要用户注册成功,就给他发邮件。接收参数:username,password,email

注册成功的同时,给注册的邮箱发激活邮件,带过去一个激活链接和激活码。因为发邮件需要时间较长,所以单独起一个线程发邮件。

2,  激活功能 – 用户从邮箱点击激活的链接,把激活码再带到激活方法。

3,  登录—只有激活的账户才能登录。

用户表:应该弄个用户状态字段,在这省了。

CREATE TABLE `users` (
  `id` varchar(32) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(32) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

激活码表::uid是用户表id,code是激活码

CREATE TABLE `active` (
  `uid` varchar(32) NOT NULL,
  `code` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

关键代码:

注册页:

<body>
    <hr/>  
    <p>主页</p>
    <font color="red">${msg}</font>  
    <form name="xx" action="" method="post">
        Name:<input type="text" name="name"/><br/>
        Pwd:<input type="text" name="pwd"/><br/>
        Email:<input type="text" name="email"/><br/>
        <input type="button" onclick="_login();" value="登录"/>
        <input type="button" onclick="_reg();" value="注册"/> 
    </form>
  </body>
</html>
  <script type="text/javascript">
      function _reg(){
          document.forms[0].action="<%=basePath%>users/register";
          document.forms[0].submit();
      }
    function _login(){
          document.forms[0].action="<%=basePath%>users/login";
          document.forms[0].submit();
      }
    </script>

发送邮件的类,是一个线程类,以加快响应速度:

/**
 * 发激活验证码邮件线程
 */
public class SendActiveEmailThread extends Thread{
  
  private Users user;
  
  public SendActiveEmailThread(Users user){
    this.user = user;
  }
  @Override
  public void run() {
    try {
      Properties p = new Properties();
      p.setProperty("mail.host","smtp.163.com");
      p.setProperty("mail.smtp.auth", "true");
      Session s = Session.getDefaultInstance(p,new Authenticator() {
        public javax.mail.PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("xxxx@163.com", "密码.");
        };
      });
      s.setDebug(true);
      MimeMessage mm = new MimeMessage(s);
      mm.setFrom(new InternetAddress("xxxx@163.com"));
      mm.setRecipient(RecipientType.TO,new InternetAddress(user.getEmail()));
      mm.setSubject("NB科技账户激活");
      //声明url
      String url = "http://127.0.0.1:8080/lhy-weixin/active/activeAccount?code="+user.getCode();
      String html ="你好:"+user.getName()+"<br/>请激活:<a href='"+url+"'>激活</a>,你可以Copy这个连接:"+url;
      mm.setContent(html,"text/html;charset=UTf-8");
      
      Transport.send(mm);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

注册方法:

@RequestMapping("/register")
  public String register(Users user){

    //保存用户
    String uid = IDUtils.genItemId()+"";
    user.setId(uid);
    //注册
    usersService.addUser(user);
    Active ac = new Active();
    ac.setUid(uid);
    //激活码
    String code = UUID.randomUUID().toString().replace("-", "")
                + UUID.randomUUID().toString().replace("-", "");
    ac.setCode(code);
    //保存激活码
    usersService.addCode(ac);
    
    //开启线程发邮件,加快响应速度
    user.setCode(code);
    new SendActiveEmailThread(user).start();
    return "regsucc";
  }

注册成功后,在邮箱点击激活,会跳转到激活方法,接收激活码:

 @RequestMapping("activeAccount")
  public String activeAccount(String code,Model model){
    //接收激活码
    int effect = userService.deleteActiveByCode(code);
    if(effect ==0){
      model.addAttribute("activeStatue", "0");
    }else{
      model.addAttribute("activeStatue", "1");
    }
    return "activeResult";
  }

登录方法:

@RequestMapping("/login")
  public String login(Users user,HttpServletRequest req,Model model){
    Users u = usersService.login(user);
    if(u==null){
      model.addAttribute("msg", "用户名或密码错误");
      return "index";
    }else{
      if(u.getCode()==null){
        req.getSession().setAttribute("user", u);
        return "main";
      }else{
        model.addAttribute("msg", "账户未激活,请激活后再登录");
        return "index";
      }
    }
  }

其实可以把激活码放到redis缓存,还设置激活码失效时间,可以对比注册时间和激活的时间。

原文地址:https://www.cnblogs.com/lihaoyang/p/7427694.html