zoukankan      html  css  js  c++  java
  • 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缓存,还设置激活码失效时间,可以对比注册时间和激活的时间。

  • 相关阅读:
    豆瓣评论9.5的《Effective Python》,帮你解决80%难题!
    编程科普|你知道的关于 Python 的那些知识,可能全错了!
    为什么建议使用 Linux?从“白嫖”到精通,只需要这几步!
    交易如钓鱼
    知识图谱学习一:啥是知识图谱,用来干啥,怎么做?
    openpyxl 学习笔记
    使用A卡(AMD Radeon RX470)进行机器学习的失败经历
    activemq 控制台报错 java.lang.SecurityException: User name [system] or password is invalid.
    activemq 安装配置二
    activemq 安装配置一
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/7427694.html
Copyright © 2011-2022 走看看