关键点就在于:

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

JavaMail之-通过邮件激活账号的更多相关文章

  1. Java实现注册时发送激活邮件+激活

    最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用 1.RegisterController.java package com.app.web.controller; import java ...

  2. 使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)

    注:本文系作者原创,但可随意转载.若有任何疑问或错误,欢迎与原作者交流,原文地址:http://www.cnblogs.com/lyosaki88/p/aspnet-itentity-ii-email ...

  3. 基于JavaMail的Java邮件发送:复杂邮件发送

    参考:http://blog.csdn.net/xietansheng/article/details/51722660package com.bfd.ftp.utils;import java.ut ...

  4. java-基于JavaMail的Java邮件发送

    1.基于JavaMail的Java邮件发送:简单邮件发送 2.基于JavaMail的Java邮件发送:复杂邮件发送

  5. ActiveMQ入门系列之应用:Springboot+ActiveMQ+JavaMail实现异步邮件发送

    现在邮件发送功能已经是几乎每个系统或网址必备的功能了,从用户注册的确认到找回密码再到消息提醒,这些功能普遍的会用到邮件发送功能.我们都买过火车票,买完后会有邮件提醒,有时候邮件并不是买完票立马就能收到 ...

  6. JavaMail(二):利用JavaMail发送复杂邮件

    上一篇文章我们学习了利用JavaMail发送简单邮件,这篇文章我们利用JavaMail发送稍微复杂一点的邮件(包含文本.图片.附件).这里只贴出核心代码,其余代码可参考JavaMail(一):利用Ja ...

  7. JavaMail技术实现邮件发送转【】

    1.导入2个jar包,mail.jar,activation.jar 2.导入的jar包与myeclipse中自带的javaee 中的javaee.jar中的javax.activation包及jav ...

  8. 基于JavaMail的Java邮件发送:简单邮件发送

    使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) . 您可以从 Java 网 ...

  9. django 通过ajax完成邮箱用户注册、激活账号

    一.图片验证码 django-simple-captcha配置 1.在pycharm中,File====>Settings====>Project:项目名====>Project I ...

随机推荐

  1. Netty学习第六节实例一步学习

    NIO与传统IO对应使用的类: ServerSocketChannel相当于ServerSocket SocketChannel 相当于Socket Selector是NIO的核心类,是负责监听Ser ...

  2. NSData与UIImage之间的转换

    1 //NSData转换为UIImage 2 NSData *imageData = [NSData dataWithContentsOfFile: imagePath]; 3 UIImage *im ...

  3. 75. Sort Colors(颜色排序) from LeetCode

      75. Sort Colors   给定一个具有红色,白色或蓝色的n个对象的数组,将它们就地 排序,使相同颜色的对象相邻,颜色顺序为红色,白色和蓝色. 这里,我们将使用整数0,1和2分别表示红色, ...

  4. Center Alignment

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93359#problem/B(456321) http://codeforces.com/ ...

  5. (用了map) Registration system

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93241#problem/C (654123) http://codeforces.com ...

  6. Android的方法数超过65535问题

    Under the Hood: Dalvik patch for Facebook for Android 先来看一段中文内容 Hack Dalvik VM解决Android 2.3 DEX/Line ...

  7. [转] libcurl异步方式使用总结(附流程图)

    文为转载,原文地址:libcurl异步方式使用总结 实习期间用到了libcurl来做HTTPS双向认证,用的是异步方式,简单总结一下. libcurl这个库的同步方式很简单,不做介绍,而异步方式很难理 ...

  8. Java设计模式の单利模式

    单利模式:确保一个类最多只有一个实例,并提供一个全局访问点. 经典单利模式创建对象代码 public class Singleton { private static Singleton unique ...

  9. Java电话监听器【精品博客】

    模拟拨打电话,接听电话,挂断电话,拨打为空号,等等,这些动作用Java接口监听的方式来完成,主要是为了训练使用接口监听回调: /** * 业务场景一: * [萍萍]--->请输入手机号码进行拨打 ...

  10. 【WP8.1】系统控件的bug及修复方案

    最近开发的时候,发现Windows Phone 8.1 Runtime中的两个控件的存在bug的情况,现总结出来,并给出解决方案. 1.Hub控件 Hub控件的顶部默认是可以拖动来切换HubSecti ...