关键点就在于:

根据用户的给出的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. js splice方法

    处理数组的方法很多,javascript splice()算是最强大的了,它可以用于插入.删除或替换数组的元素.下面来一一介绍! 1.删除-用于删除元素,两个参数,第一个参数(要删除第一项的位置),第 ...

  2. UVa 10970 Big Chocolate (想一下就AC了)

    题意:给你一个m*n的巧克力,让人把它切成1*1的,但是每次只能切一下,问要切多少刀. 析:简单啊,我就不明白了 怎么那么多人TLE了,不会当DP做了吧,其实不用的. 假设有一个1*m的巧克力,很明显 ...

  3. css3美化滚动条样式

    1.改变浏览器默认的滚动条样式 ::-webkit-scrollbar-track-piece { //滚动条凹槽的颜色,还可以设置边框属性 background-color:#f8f8f8; } : ...

  4. Chrome报错:跨域问题处理( Access-Control-Allow-Origin)_ 用于本地测试的快捷解决方法

    报错提示如下: XMLHttpRequest cannot load http://www.xxxx.com/264/Data/GetScreenInfo. No 'Access-Control-Al ...

  5. 201709013工作日记--static理解 && abstract

    1.关于viewHolder设置成static的讨论 一般情况下是尽量不要使用static关键字,因为static一旦有引用变量指向了变量,使用完毕后而没有设置null,就会造成内存泄露,而且很难排查 ...

  6. Boost库安装理解

    Boost安装的安装,以及在VS2013下的使用 1. 为什么要安装? boost是一个开源库,因为开源库可以跨平台,可以通过在不同的“硬件”平台上.所以需要安装的操作. 安装,然后编译生成“静态链接 ...

  7. Paul and Joyce are going to a movie(More listening of Unit 2)

      Paul: Hurry up, Joyce. We need to leave now if we're going to get to the theater a half hour befor ...

  8. Alpha阶段项目复审(小小大佬带飞队)

    Alpha阶段项目复审 小组的名字 优点 缺点,bug报告(至少140字) 最终名次(无并列) 只会嘤嘤嘤队 题材比较新颖!游戏和记单词的结合  有浏览器不兼容问题 5 GG队 样式新颖,自动导入好评 ...

  9. Text Converted into Speech in Pi

    Step 1: Convert any text into uint8 type in matlab : Step 2: Add models in matlab : copy the uint8 n ...

  10. dotNet core 应用部署centos

    ---恢复内容开始--- 阅读目录 需要安装的插件以及支撑架构 安装dotnetSDK 安装jexus 安装supervisord 遇到问题汇总 注意事项.扩展延伸 需要安装的插件以及支撑架构 1.d ...