Javaweb邮箱验证注册的实现


步骤:
1.调用后台在数据库里新增用户,(应有三个栏位:激活状态,激活码,有效时间)

DWR前端:userService.register(u,function(){...})
//-------------------------------------
    public User register(User user) throws AddressException, NoSuchAlgorithmException, MessagingException{
        User u = this.loadByEmail(user.getEmail());
        //验证数据库是否存在,避免重复邮箱注册
        if(u==null) {
            //MD5密码加密
            user.setPassword(SecurityUtil.md5(user.getPassword()));
            //初始化属性
            user.setStatus(0);
            user.setType("student");
            user.setPower(0);
            user.setLevel(0);
            //调用发送邮件服务--函数在步骤2
            user = MailUtil.activateMail(user);
            this.add(user);
        }
        return u;
    }

2.发送邮件


public class MailUtil{       
 public static final String FROM = "zhengzran@163.com";//发件人的email
        public static final String PWD = "******";//发件人密码--邮箱密码
        public static final String URL = "http://localhost:8888/iclass";//项目主页
        public static final int TIMELIMIT = 1000*60*60*24; //激活邮件过期时间24小时
        public static final String TITLE = "iClass账户激活邮件";
        public static final String HOST = "smtp.163.com";
        public static final String SMTP = "smtp";
//---------------自定义函数-----------------
        public static User activateMail(User u) throws AddressException, MessagingException, NoSuchAlgorithmException {
            //注册邮箱
            String to  = u.getEmail();
            //当前时间戳
            Long curTime = System.currentTimeMillis();
            //激活的有效时间
            Long activateTime = curTime+TIMELIMIT;
            //激活码--用于激活邮箱账号
            String token = to+curTime;
            u.setToken(SecurityUtil.md5(token));
            u.setCreateDate(new Date());
            token = u.getToken();
            //过期时间
            u.setActivateTime(activateTime);
            //发送的邮箱内容
            String content = "<p>您好 O(∩_∩)O~~<br><br>欢迎加入iClass!<br><br>帐户需要激活才能使用,赶紧激活成为iClass正式的一员吧:)<br><br>请在24小时内点击下面的链接立即激活帐户:"
            +"<br><a href='"+URL+"/activatemail/?token="+token+"&email="+to+"'>"
            +URL+"/activatemail/?token="+token+"&email="+to+"</a></p>";
            //调用发送邮箱服务
            MailUtil.sendMail(to, TITLE, content);
            return u;
        }
//---------------发送邮件-------------------
        public static void sendMail(String to,String title,String content) throws AddressException, MessagingException {

        Properties props = new Properties(); //可以加载一个配置文件  
        // 使用smtp:简单邮件传输协议  
        props.put("mail.smtp.host", HOST);//存储发送邮件服务器的信息  
        props.put("mail.smtp.auth", "true");//同时通过验证  
        Session session = Session.getInstance(props);//根据属性新建一个邮件会话  
        //session.setDebug(true); //有他会打印一些调试信息。  
        MimeMessage message = new MimeMessage(session);//由邮件会话新建一个消息对象  
        message.setFrom(new InternetAddress(FROM));//设置发件人的地址  
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));//设置收件人,并设置其接收类型为TO  
        message.setSubject(title);//设置标题  
        //设置信件内容  
        //message.setText(mailContent); //发送 纯文本 邮件 todo  
        message.setContent(content, "text/html;charset=gbk"); //发送HTML邮件,内容样式比较丰富  
        message.setSentDate(new Date());//设置发信时间  
        message.saveChanges();//存储邮件信息  
        //发送邮件  
        Transport transport = session.getTransport(SMTP);  
        //Transport transport = session.getTransport();  
        transport.connect(FROM, PWD);
        transport.sendMessage(message, message.getAllRecipients());//发送邮件,其中第二个参数是所有已设好的收件人地址  
        transport.close();  
    }


如果前面顺利的话,就会收到如下的激活邮件:

3.激活邮箱账号

//SpringMVC的映射
    @RequestMapping("/activatemail")
    public  String hello(HttpServletRequest request,Model model) throws IOException, AddressException, MessagingException, NoSuchAlgorithmException {
        //获取激活参数
        String email = request.getParameter("email");
        String token = request.getParameter("token");
        Long time = System.currentTimeMillis();
        User u = userService.loadByEmail(email);
        UserDTO ud = new UserDTO();
        ud.setMail(email);
        if(u!=null) {
            ud.setEmail(1);
            if(u.getStatus()==0&&u.getActivateTime()!=1) {
                if(u.getActivateTime()<time) {
                    //过期--激活失败
                    u.setActivateTime(Long.parseLong("-1"));
                    //重新发送激活邮件
                    u = MailUtil.activateMail(u);
                    //重新设置了有效时间和token激活码
                    userService.updateUser(u);
                    ud.setTime(-1);
                    model.addAttribute("user", JsonUtil.toJson(ud));
                    //resp.getWriter().write(JsonUtil.toJson(u));
                } else if (u.getActivateTime()>time){
                    //在时间内
                    u.setActivateTime(Long.parseLong("1"));
                    ud.setTime(1);
                    if(u.getToken().equals(token)) {
                        //在时间内且激活码通过,激活成功
                        u.setStatus(1);
                        u.setCreateDate(new Date());
                        //重新设置token防止被禁用的用户利用激活
                        u.setToken(token.replace("1", "c"));
                        u.setType("student");
                        userService.updateUser(u);
                        ud.setToken(1);
                        ud.setStatus(1);
                        model.addAttribute("user", JsonUtil.toJson(ud));
                        //resp.getWriter().write(JsonUtil.toJson(u));
                    } else {
                        //在时间内但是且激活码错误
                        ud.setToken(-1);
                        model.addAttribute("user", JsonUtil.toJson(ud));
                    }
                }
                //u.getStatus()!=1判断结束
            } else if(u.getStatus()==1) {
                //已经被激活的重复点链接
                ud.setStatus(-1);
                model.addAttribute("user", JsonUtil.toJson(ud));
            }
        //u为空
        } else if(u==null) {
            ud.setEmail(-1);
            model.addAttribute("user", JsonUtil.toJson(ud));
        }
        return "activatemail";
    }
基本完成了邮箱验证注册功能,不同的框架可能会有一些差别,但原理基本是一样的,
注意,发送邮箱的账号需要把smtp服务打开,163邮箱默认就是打开的。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值