用Java实现邮箱激活账号功能

前面转载了一篇用邮件激活账号的文章,这里简单实现了一下。

简单的逻辑:

1.实体类

只有一个简单的User

package org.ygy.model;import java.util.Calendar;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;@Entity@Table(name = "t_user")public class User {private Long id;private String email;//邮箱地址private Integer status;//状态,0-未激活;1-已激活private String validateCode;//激活码private Date registerTime;//注册时间public User() {}@Id@GeneratedValuepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}@Column(nullable=false , unique=true)public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public String getValidateCode() {return validateCode;}public void setValidateCode(String validateCode) {this.validateCode = validateCode;}@Temporal(TemporalType.TIMESTAMP)@Column(nullable = false)public Date getRegisterTime() {return registerTime;}public void setRegisterTime(Date registerTime) {this.registerTime = registerTime;}@Transientpublic Date getLastActivateTime() {Calendar cl = Calendar.getInstance();cl.setTime(registerTime);cl.add(Calendar.DATE , 2);return cl.getTime();}}2.注册页面

这里就只有一个邮箱,没有其他的信息。

这里可用Ajax,验证一下邮箱是否已经被注册。

3.控制层

这里用Servlet处理一下

package org.ygy.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.ygy.service.ServiceException;import org.ygy.service.UserService;public class UserServlet extends HttpServlet {private static final long serialVersionUID = 3202117956537528245L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req , resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String action = req.getParameter("action");UserService service = new UserService();if("register".equals(action)) {//注册String email = req.getParameter("email");service.processRegister(email);req.getRequestDispatcher("register_success.jsp").forward(req , resp);} else if("activate".equals(action)) {//激活String email = req.getParameter("email");String validateCode = req.getParameter("validateCode");try {service.processActivate(email , validateCode);req.getRequestDispatcher("activate_success.jsp").forward(req , resp);} catch (ServiceException e) {req.setAttribute("message" , e.getMessage());req.getRequestDispatcher("activate_failure.jsp").forward(req , resp);}}}}4.业务逻辑层

这里有两个方法,一个处理注册,一个处理激活

在处理激活时,,对链接的可以进行更严谨的验证

package org.ygy.service;import java.util.Date;import org.ygy.dao.UserDao;import org.ygy.model.User;import org.ygy.util.MD5Util;import org.ygy.util.MailUtil;public class UserService {private UserDao dao = null;/** * 处理注册 * @param email */public void processRegister(String email) {User user = new User();user.setEmail(email);user.setRegisterTime(new Date());user.setStatus(0);//这里可以将激活码设计的更复杂user.setValidateCode(MD5Util.encode2hex(email));dao = new UserDao();dao.save(user);//发送邮件StringBuffer sb = new StringBuffer("点击下面链接激活账号,48小时生效,否则重新注册账号,链接只能使用一次,请尽快激活!</br>");sb.append("<a href=\&;:8080/JavaMailDemo/user?action=activate&email=").append(email).append("&validateCode=").append(user.getValidateCode()).append("\&;>:8080/JavaMailDemo/user?action=activate&email=").append(email).append("&validateCode=").append(user.getValidateCode()).append("</a>");MailUtil.send(email , sb.toString());}/** * 处理激活 * @param email 邮箱地址 * @param validateCode 验证码 * @throws ServiceException */public void processActivate(String email , String validateCode)throws ServiceException {dao = new UserDao();User user = dao.findByEmail(email);//验证用户是否存在if(user != null) {//验证用户状态if(user.getStatus() == 0) {Date currentTime = new Date();//验证链接是否过期if(currentTime.before(user.getLastActivateTime())) {//验证激活码是否正确if(validateCode.equals(user.getValidateCode())) {//激活成功,dao.updateUserStatus(user.getId(), 1);} else {throw new ServiceException("激活码不正确");}} else {throw new ServiceException("激活码已过期!");}} else {throw new ServiceException("邮箱已激活,请登录!");}} else {throw new ServiceException("该邮箱未注册(邮箱地址不存在)!");}}}5.持久层package org.ygy.dao;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.Transaction;import org.ygy.model.User;import org.ygy.util.HibernateUtil;public class UserDao {/** * 保存用户 * @param user */public void save(User user) {Session session = HibernateUtil.getSession();Transaction tx = session.beginTransaction();try {session.save(user);tx.commit();} catch (HibernateException e) {e.printStackTrace();tx.rollback();} finally {HibernateUtil.closeSession();}}/** * 根据Email查找用户 * @param email * @return */public User findByEmail(String email) {Session session = HibernateUtil.getSession();session.beginTransaction();User user = (User) session.createQuery("select u from User u where u.email=?").setString(0 , email).uniqueResult();session.getTransaction().commit();HibernateUtil.closeSession();return user;}/** * 更新用户状态 * @param status */public void updateUserStatus(Long id , int status) {Session session = HibernateUtil.getSession();Transaction tx = session.beginTransaction();try {session.createQuery("update User u set u.status=? where u.id=?").setInteger(0 , status).setLong(1 , id).executeUpdate();tx.commit();} catch (HibernateException e) {e.printStackTrace();tx.rollback();} finally {HibernateUtil.closeSession();}}}6.完整代码

一些代码没有贴出来,已经将代码上传,希望有帮助!

注:下载之后,记得将MailUtil中的邮箱地址和密码改一下:

public static final String FROM = "xxx";public static final String PWD = "xxx";

下载地址:

无做什么,记得为自己而做,那就毫无怨言。

用Java实现邮箱激活账号功能

相关文章:

你感兴趣的文章:

标签云: