前面转载了一篇用邮件激活账号的文章,这里简单实现了一下。
简单的逻辑:
- 用户在注册页面,输入邮箱地址
- 后台生成一个激活码,将用户信息保存,并发送激活邮件
- 用户点击邮箱中的链接来激活
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
- @GeneratedValue
- public 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;
- }
- @Transient
- public 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;
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doPost(req , resp);
- }
- @Override
- protected 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=\"http://localhost:8080/JavaMailDemo/user?action=activate&email=")
- .append(email)
- .append("&validateCode=")
- .append(user.getValidateCode())
- .append("\">http://localhost: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";