关键点就在于:

根据用户的给出的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. com.liuyang.exception.DaoException: java.sql.SQLException: Incorrect string

    错误是在JUnit测试的时候产生的,但是实际加入数据也会产生这样的情况,主要是数据库内部的编码方式不支持当前的编码方式导致的冲突,解决方法就是在建立数据库之前,要查看当前的数据库的编码方式,方法和更改 ...

  2. joint python文件拼接

    # -*- coding:utf-8 -*- import os import re p1=r"([0-9][0-9][AB])\.\w{3}$" p2=r"^.+\,( ...

  3. 关于RabbitMQ一点

    RabbitMQ是AMQP(高级消息队列协议)的标准实现,理论上可以保证消息发送的准确性 RabbitMQ是用Erlang语言编写的,而Erlang语言具有以下特点: 并发性--Erlang支持超大量 ...

  4. Codeforces735D Taxes 2016-12-13 12:14 56人阅读 评论(0) 收藏

    D. Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  5. Hibernate 注解和配置文件两种方法的对比(有实例)

    hibernate多对多形式(User类<---->Educate类) 1.基于注解的形式: User类: package com.ssh.entities; import java.ut ...

  6. 使用工厂方法配置bean的两种方式

    1.使用静态工厂方法: 对应的配置.xml文件: 2.通过实例工厂的方法来配置bean: 对应的xml文件:

  7. [php] cookie 跨域共享

    <?php // m.hinabian.com class Controller_Cookie extends Hnb_Base_Controller { public function ini ...

  8. Android-卖票案例static-不推荐此方式

    需求描述:四个窗口一起卖票,把10张票卖完,不许多卖 先看一个错误的案例: package android.java.thread06; /** * 售票线程 */ class Booking ext ...

  9. log.debug(e.getMessage());

    private static final Log log = LogFactory.getLog(AbcAction.class); @ManagedProperty(name = "abc ...

  10. .net core获取服务器本地IP及Request访问端口

    string str = (Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + ...