由于本人实战项目,编码习惯等方面欠缺,本文存在不妥地方,还请大家多多留言。特此声明:此文仅作技术交流与探讨,不允许发垃圾邮件等破坏公共信息安全行为,爱护网络环境,人人有责。
本系统参考的博文有:
- 系统分层:https://blog.csdn.net/zdwzzu2006/article/details/6053006
- 邮箱服务器,邮件客户端配置:https://blog.csdn.net/qq_41264674/article/details/81303641
案例:用户去注册某网站,输入其邮箱,并去邮箱里激活。
环境搭建
- 邮箱服务器:eyou邮件服务器(免费)
- 邮箱客户端:FoxMail
- 邮箱服务器,邮件客户端配置请参考:配置详情请点击
- 本文邮箱服务器配置如下:
邮箱注册管理员(boss@study.com),用户(user2@study.com)
用户登录
系统分层
- 此局部系统处理分为3层,Controller,Service,DAO。
- Controller层:Controller层负责具体的业务模块流程的控制。
- Service层:Service层主要负责业务模块的逻辑应用设计
- DAO(Data Access Objects)层:DAO层主要是做数据持久层的工作。
详细设计
用户注册分为以下2步:
- 用户添加
- 邮件激活
用户添加
- 用户添加时序图如下
注释:
User:用户
MailUtil:发送邮件工具类。
3、封装用户并添加:封装用户(给注册用户设置state,code),并添加至Database。
用户激活(DB:改变用户状态,清除激活码)
- 时序图如下:
注释:
5、更新用户状态:(user表实际操作state:1,code:null)
编码
创建表
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`nickname` varchar(20) DEFAULT NULL,
`email` varchar(30) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`code` varchar(64) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;
工具类:
- 管理员:Admin
package org.badwritten.study.entity;
/**
* 管理员
* @author Bad Written
*
*/
public class Admin {
private static String adminEmail;
private static String passWord;
private static String url;
public static String getAdminEmail() {
return adminEmail;
}
public static void setAdminEmail(String adminEmail) {
Admin.adminEmail = adminEmail;
}
public static String getPassWord() {
return passWord;
}
public static void setPassWord(String passWord) {
Admin.passWord = passWord;
}
public static String getUrl() {
return url;
}
public static void setUrl(String url) {
Admin.url = url;
}
}
管理员配置文件
adminEmail=boss@study.com
passWord=123
#邮件激活访问路径
url=http://localhost:8080/email/active.do
- 产生激活码:
package org.badwritten.study.utils;
import java.util.UUID;
/**
* 生成随机32位字符串工具类
* @author Bad Written
*
*/
public class UuidTils {
public static String getState(){
return UUID.randomUUID().toString().replace("-", "");
}
}
- 发送邮件工具(MailUtil)
jar包:javax.mail.jar
前提:Admin类随着服务器启动,就被实例化。
package org.badwritten.study.utils;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import org.badwritten.study.entity.Admin;
/**
* 邮件发送的工具类
* @author Bad Written
*
*/
public class MailUtils{
/**
* Admin类随着服务器启动,就被实例化。
* 发送邮件方法
* @param to:收件人
* @param code:激活码
* @throws Exception
*/
public static void sendMail(String to,String code) throws Exception{
//1、创建连接对象,连接到邮箱服务器
Properties props=new Properties();
Session session=Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//官方登录的用户名及密码
return new PasswordAuthentication(Admin.getAdminEmail(),Admin.getPassWord());
}
});
//2、创建邮件对象
Message message=new MimeMessage(session);
//2.1、设置发件人
message.setFrom(new InternetAddress(Admin.getAdminEmail()));
//2.2、设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(to));
//2.3、设置邮件主题
message.setSubject("来自火星站邮件激活");
//2.4、设置邮件正文
String context="<h1>来自火星站站邮件激活,激活请点击一下链接:</h1>"
+ "<h3>"
+ "<a href='"+Admin.getUrl()+"?code="+code+"'>"+Admin.getUrl()+"?code="+code+"</a>"
+ "</h3>";
message.setContent(context, "text/html;charset=UTF-8");
//3、发送一封激活独享
Transport.send(message);
}
}
测试
注册:
邮箱激活:点击链接
邮件激活之后:Database 再确认