java 邮箱验证激活

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

简单的逻辑:

  1. 用户在注册页面,输入邮箱地址
  2. 后台生成一个激活码,将用户信息保存,并发送激活邮件
  3. 用户点击邮箱中的链接来激活

1.实体类

只有一个简单的User

[java]  view plain  copy
  1. package org.ygy.model;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5.   
  6. import javax.persistence.Column;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.Table;  
  11. import javax.persistence.Temporal;  
  12. import javax.persistence.TemporalType;  
  13. import javax.persistence.Transient;  
  14.   
  15. @Entity  
  16. @Table(name = "t_user")  
  17. public class User {  
  18.     private Long id;  
  19.     private String email;//邮箱地址  
  20.     private Integer status;//状态,0-未激活;1-已激活  
  21.     private String validateCode;//激活码  
  22.     private Date registerTime;//注册时间  
  23.   
  24.     public User() {}  
  25.       
  26.     @Id  
  27.     @GeneratedValue  
  28.     public Long getId() {  
  29.         return id;  
  30.     }  
  31.   
  32.     public void setId(Long id) {  
  33.         this.id = id;  
  34.     }  
  35.   
  36.     @Column(nullable=false , unique=true)  
  37.     public String getEmail() {  
  38.         return email;  
  39.     }  
  40.   
  41.     public void setEmail(String email) {  
  42.         this.email = email;  
  43.     }  
  44.   
  45.     public Integer getStatus() {  
  46.         return status;  
  47.     }  
  48.   
  49.     public void setStatus(Integer status) {  
  50.         this.status = status;  
  51.     }  
  52.   
  53.     public String getValidateCode() {  
  54.         return validateCode;  
  55.     }  
  56.   
  57.     public void setValidateCode(String validateCode) {  
  58.         this.validateCode = validateCode;  
  59.     }  
  60.   
  61.     @Temporal(TemporalType.TIMESTAMP)  
  62.     @Column(nullable = false)  
  63.     public Date getRegisterTime() {  
  64.         return registerTime;  
  65.     }  
  66.   
  67.     public void setRegisterTime(Date registerTime) {  
  68.         this.registerTime = registerTime;  
  69.     }  
  70.       
  71.     @Transient  
  72.     public Date getLastActivateTime() {  
  73.         Calendar cl = Calendar.getInstance();  
  74.         cl.setTime(registerTime);  
  75.         cl.add(Calendar.DATE , 2);  
  76.           
  77.         return cl.getTime();  
  78.     }  
  79.   
  80. }  

2.注册页面

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

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

3.控制层

这里用Servlet处理一下

[java]  view plain  copy
  1. package org.ygy.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.ygy.service.ServiceException;  
  11. import org.ygy.service.UserService;  
  12.   
  13. public class UserServlet extends HttpServlet {  
  14.     private static final long serialVersionUID = 3202117956537528245L;  
  15.   
  16.     @Override  
  17.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  18.             throws ServletException, IOException {  
  19.         doPost(req , resp);  
  20.     }  
  21.   
  22.     @Override  
  23.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  24.             throws ServletException, IOException {  
  25.         String action = req.getParameter("action");  
  26.           
  27.         UserService service = new UserService();  
  28.         if("register".equals(action)) {  
  29.             //注册  
  30.             String email = req.getParameter("email");  
  31.             service.processRegister(email);  
  32.               
  33.             req.getRequestDispatcher("register_success.jsp").forward(req , resp);  
  34.         } else if("activate".equals(action)) {  
  35.             //激活  
  36.             String email = req.getParameter("email");  
  37.             String validateCode = req.getParameter("validateCode");  
  38.               
  39.             try {  
  40.                 service.processActivate(email , validateCode);  
  41.                 req.getRequestDispatcher("activate_success.jsp").forward(req , resp);  
  42.             } catch (ServiceException e) {  
  43.                 req.setAttribute("message" , e.getMessage());  
  44.                 req.getRequestDispatcher("activate_failure.jsp").forward(req , resp);  
  45.             }  
  46.               
  47.         }  
  48.     }  
  49.   
  50. }  

4.业务逻辑层

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

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

[java]  view plain  copy
  1. package org.ygy.service;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.ygy.dao.UserDao;  
  6. import org.ygy.model.User;  
  7. import org.ygy.util.MD5Util;  
  8. import org.ygy.util.MailUtil;  
  9.   
  10. public class UserService {  
  11.     private UserDao dao = null;  
  12.       
  13.     /** 
  14.      * 处理注册 
  15.      * @param email 
  16.      */  
  17.     public void processRegister(String email) {  
  18.         User user = new User();  
  19.         user.setEmail(email);  
  20.         user.setRegisterTime(new Date());  
  21.         user.setStatus(0);  
  22.         //这里可以将激活码设计的更复杂  
  23.         user.setValidateCode(MD5Util.encode2hex(email));  
  24.           
  25.         dao = new UserDao();  
  26.         dao.save(user);  
  27.           
  28.         //发送邮件  
  29.         StringBuffer sb = new StringBuffer("点击下面链接激活账号,48小时生效,否则重新注册账号,链接只能使用一次,请尽快激活!</br>");  
  30.         sb.append("<a href=\"http://localhost:8080/JavaMailDemo/user?action=activate&email=")  
  31.             .append(email)  
  32.             .append("&validateCode=")  
  33.             .append(user.getValidateCode())  
  34.             .append("\">http://localhost:8080/JavaMailDemo/user?action=activate&email=")  
  35.             .append(email)  
  36.             .append("&validateCode=")  
  37.             .append(user.getValidateCode())  
  38.             .append("</a>");  
  39.         MailUtil.send(email , sb.toString());  
  40.               
  41.     }  
  42.       
  43.     /** 
  44.      * 处理激活 
  45.      * @param email 邮箱地址 
  46.      * @param validateCode 验证码 
  47.      * @throws ServiceException  
  48.      */  
  49.     public void processActivate(String email , String validateCode)throws ServiceException {  
  50.         dao = new UserDao();  
  51.         User user = dao.findByEmail(email);  
  52.           
  53.         //验证用户是否存在  
  54.         if(user != null) {  
  55.             //验证用户状态  
  56.             if(user.getStatus() == 0) {  
  57.                 Date currentTime = new Date();  
  58.                 //验证链接是否过期  
  59.                 if(currentTime.before(user.getLastActivateTime())) {  
  60.                     //验证激活码是否正确  
  61.                     if(validateCode.equals(user.getValidateCode())) {  
  62.                         //激活成功,  
  63.                         dao.updateUserStatus(user.getId(), 1);  
  64.                     } else {  
  65.                         throw new ServiceException("激活码不正确");  
  66.                     }  
  67.                 } else {  
  68.                     throw new ServiceException("激活码已过期!");  
  69.                 }  
  70.             } else {  
  71.                 throw new ServiceException("邮箱已激活,请登录!");  
  72.             }  
  73.         } else {  
  74.             throw new ServiceException("该邮箱未注册(邮箱地址不存在)!");  
  75.         }  
  76.           
  77.     }  
  78.   
  79. }  

5.持久层

[java]  view plain  copy
  1. package org.ygy.dao;  
  2.   
  3. import org.hibernate.HibernateException;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.Transaction;  
  6. import org.ygy.model.User;  
  7. import org.ygy.util.HibernateUtil;  
  8.   
  9. public class UserDao {  
  10.   
  11.     /** 
  12.      * 保存用户 
  13.      * @param user 
  14.      */  
  15.     public void save(User user) {  
  16.         Session session = HibernateUtil.getSession();  
  17.         Transaction tx = session.beginTransaction();  
  18.           
  19.         try {  
  20.             session.save(user);  
  21.             tx.commit();  
  22.         } catch (HibernateException e) {  
  23.             e.printStackTrace();  
  24.             tx.rollback();  
  25.         } finally {  
  26.             HibernateUtil.closeSession();  
  27.         }  
  28.           
  29.     }  
  30.   
  31.     /** 
  32.      * 根据Email查找用户 
  33.      * @param email 
  34.      * @return 
  35.      */  
  36.     public User findByEmail(String email) {  
  37.         Session session = HibernateUtil.getSession();  
  38.         session.beginTransaction();  
  39.           
  40.         User user = (User) session.createQuery("select u from User u where u.email=?")  
  41.                             .setString(0 , email)  
  42.                             .uniqueResult();  
  43.           
  44.         session.getTransaction().commit();  
  45.         HibernateUtil.closeSession();  
  46.           
  47.         return user;  
  48.     }  
  49.   
  50.     /** 
  51.      * 更新用户状态  
  52.      * @param status 
  53.      */  
  54.     public void updateUserStatus(Long id , int status) {  
  55.         Session session = HibernateUtil.getSession();  
  56.         Transaction tx = session.beginTransaction();  
  57.           
  58.         try {  
  59.             session.createQuery("update User u set u.status=? where u.id=?")  
  60.                     .setInteger(0 , status)  
  61.                     .setLong(1 , id)  
  62.                     .executeUpdate();  
  63.             tx.commit();  
  64.         } catch (HibernateException e) {  
  65.             e.printStackTrace();  
  66.             tx.rollback();  
  67.         } finally {  
  68.             HibernateUtil.closeSession();  
  69.         }  
  70.     }  
  71.   
  72. }  

6.完整代码

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

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

[java]  view plain  copy
  1. public static final String FROM = "xxx";  
  2. public static final String PWD = "xxx";  
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页