在寝室无聊,就去学习了一下注册邮箱验证的功能,实现起来也是非常简单。
先来说说原理,当用户注册时有用户名密码和邮箱,在提交action时serviceImpl
中会给用户表中赋值用户激活状态的字段,未激活为0,当然,激活为1.再赋值一个
用户的激活唯一标示码,在service中还有邮箱工具类,但用户输入了注册的邮箱时,
我们通过users.get 得到你所输入的邮箱 并且给你的邮箱发送激活邮件,工具类中
MailUtil.sendMail(users.getUmail(), users.getUcode()); 第二个字段是设置我们需要点击激活的唯一
标示,当用户点击这个(<a>http://localhost:8080/demos/admin/users_jihuo.action?ucode="+ucode+"</a>)验证的这个action时,通过这个标示查询这个用户,当users不为空我们就修改激活状态为1,并去掉
标示码ucode,标示码再未激活时存在,再激活后set为null;此时页面就到了用户激活成功页面。
1.首先我们编写一个邮件发送的工具类。还需要一个生成提交链接后的唯一标示码,在第四点有代码。
1.1 工程需要两个基本jar包,一个是smtp.jar,一个是javamail.jar的jar包
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* 邮件发送的工具类
* @author Administrator
*
*/
public class MailUtil {
public static void sendMail(String to,String ucode) throws Exception{
Properties properties = new Properties();
//创建链接对象
//properties.setProperty(key, value)
// 开启debug调试
properties.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
properties.setProperty("mail.smtp.auth", "true");
// 发送邮件协议名称
properties.setProperty("mail.transport.protocol", "smtp");
// 设置邮件服务器主机名
properties.setProperty("mail.host", "smtp.sina.com");
Session session = Session.getInstance(properties,
new Authenticator()
{
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
// TODO Auto-generated method stub
return new PasswordAuthentication("pinkopen@sina.com","填写自己的密码");
}
});
//2创建邮件对象
Message message = new MimeMessage(session);
//2.1设置发件人
message.setFrom(new InternetAddress("pinkopen@sina.com"));
//2.2设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(to));
//2.3设置邮件主题
message.setSubject("管理员网的账号激活");
//2.4邮件的正文
message.setContent("<h1>来自管理员后台注册的激活邮件,激活请点击以下链接</h1><h3><a href='http://localhost:8080/demos/admin/users_jihuo.action?ucode="+ucode+"'>http://localhost:8080/demos/admin/users_jihuo.action?ucode="+ucode+"</a></h3>", "text/html;charset=utf-8");
//3发送
Transport.send(message);
}
}
2.第二步我们来编写action中方法以及dao层中对数据访问的方法
2.1 这是daoimpl中对注册的数据访问实现的是对注册的用户接口
2.2 实现接口中的方法,
2.1
public interface UsersDao {
//通过邮箱注册
public void reg(Users users);
//根据激活查询用户
public Users findByCode(String ucode);
//修改用户的方法
public void update(Users users);
}
2.2
public class UsersDaoImpl implements UsersDao {
@Override
//dao中注册用户
public void reg(Users users) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.save(users);
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
HibernateUtil.closeSession();
}
}
@Override
//dao中根据激活码查询用户
public Users findByCode(String ucode) {
Session session = HibernateUtil.getSession();
Query query = session.createQuery("from Users u where u.ucode = ?");
query.setString(0,ucode);
Users users = (Users) query.uniqueResult();
return users;
}
//dao中修改用户的方法,主要实现修改用户点击邮件的后的状态 ustate 由最开始插入的0 变为 已经激活的 1,
//当用户点击激活邮件是,通过ucode的唯一编码激活并将 ucode变为null
@Override
public void update(Users users) {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.update(users);
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
HibernateUtil.closeSession();
}
}
}
3 现在我们来编写业务逻辑层中的代码
3.1 业务逻辑层的接口
public interface UsersService {
//通过邮箱注册
public void reg(Users users) throws Exception;
//根据激活查询用户
public Users findByCode(String ucode) throws Exception;
//修改用户的方法
public void update(Users users) throws Exception;
}
3.2 实现的类
public class UsersServiceImpl implements UsersService {
private UsersDao usersdao = new UsersDaoImpl();
/**
* 注册时的业务逻辑
* 注册时给ustate赋值未激活的0
* 给注册的唯一标识码ucode赋值
*/
@Override
public void reg(Users users) throws Exception{
users.setUstate(0);
String uuid = UuidUtil.getUUID();
users.setUcode(uuid);
usersdao.reg(users);
MailUtil.sendMail(users.getUmail(), users.getUcode());
}
@Override
//根据激活查询用户
public Users findByCode(String ucode) throws Exception {
return usersdao.findByCode(ucode);
}
@Override
//业务层修改用户的方法
public void update(Users users) throws Exception {
usersdao.update(users);
}
}
4:编写ucode 唯一标示的工具类
这里生成的是一个32位的标示,想要更长在usersservicesImpl 中相加就ok了 就这样 UuidUtil.getUUID() +UuidUtil.getUUID();
/**
* 生成随机字符的工具类
* @author Administrator
*
*/
public class UuidUtil {
public static String getUUID(){
return UUID.randomUUID().toString().replace("-", "");
}
}
5.但这些都编写好了,我们就可以在action中来实现用户注册时通过自己的邮箱账号同时给注册用户的邮箱发送激活链接邮件。
5.1 这个里面注册界面是有三个字段需要获取,第一个是uname,用户名 ,第二个是upass密码,第三歌就是邮箱了.
<form class="am-form tpl-form-line-form" action="<%=request.getContextPath()%>/admin/users_reg.action" method="post">
<div class="am-form-group">
<input type="text" class="tpl-form-input" name="users.uname" placeholder="用户名">
</div>
<div class="am-form-group">
<input type="password" class="tpl-form-input" name="users.upass" placeholder="请输入密码">
</div>
<div class="am-form-group">
<input type="text" class="tpl-form-input" name="users.umail" placeholder="邮箱">
</div>
</form>
注意: 由于action中使用javaben的方式,所以自己生成所需的 uname ,upass,umail,ucode的set get方法
自己还需要编写俩个页面,一个是注册成功后,向用户反馈注册成功页面,请到邮箱激活。
还有一个为,用户点击链接后,提交了action,到用户激活成功页面,提示用户登录。
struts.xml就不在这里写了,整理的有点杂乱,但代码贴的比较全。
/**
* 邮箱验证注册
* @return
* @throws Exception
*/
public String reg() throws Exception {
usersService.reg(users);
request.setAttribute("msg","注册成功,点击以下邮箱链接前去激活!");
return "reg_mail_success";
}
//根据激活码查询用户
public String jihuo() throws Exception {
Users users = usersService.findByCode(ucode);
if (users!=null) {
//已经查询到,激活用户
users.setUstate(1);
users.setUcode(null);
usersService.update(users);
request.setAttribute("msg","您的账号已经激活成功,可点击以下链接请登录!");
}else{
//激活码没有查询到该用户
request.setAttribute("msg", "您的激活码有误!");
}
return "success_jihuo";
}
6.为了方便学习 sql代码也贴出来,担然在注册时还可以添加时间字段。在services中set系统注册的当前时间
create table users(
uid int primary key identity,
uname varchar(20) not null,
upass varchar(20) not null,
umail varchar(20) not null,
ustate int null ,
ucode varchar(60) null
)