关键点就在于:
根据用户的给出的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缓存,还设置激活码失效时间,可以对比注册时间和激活的时间。
欢迎关注个人公众号一起交流学习:
