关键点就在于:
根据用户的给出的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缓存,还设置激活码失效时间,可以对比注册时间和激活的时间。