`
endual
  • 浏览: 3558420 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 帐号激活与忘记密码 实例

    博客分类:
  • java
 
阅读更多

 

[置顶] JavaMail学习笔记(七)、帐号激活与忘记密码 实例

分类: JavaMail JavaEE 158人阅读 评论(0) 收藏 举报

一、帐户激活


          在很多时候,在某些网站注册一个用户之后,网站会给这个用户注册时填写的email地址发送一封帐户激活邮件,这封邮件的内容就是一个激活帐户的链接和一段简短的文字描述,如果用户没有去邮箱将帐户激活,可能在使用网站的某些功能时就会受到限制,比如不能发贴、下载资料、评论等限制。这么做的原因应该是为了保证帐户的安全性和邮箱的有效性,以后网站如果有什么活动、资讯或系统安全通知等,可以在第一时间通知到用户。比如我在奇艺视频网站注册一个帐号之后,它就会往我注册时填写的邮箱中发一封帐户激活的邮件,邮件中有一个激活的链接,点击它就可以将你的帐户激活。如下图所示:

这个功能是怎么做到的呢,其实实现也是很简单的,说白了就是一个Update操作。

实现思路:当一个用户注册成功之后,系统向用户注册时提供的email地址发送一封邮件,邮件的内容是一个激活帐户的链接和一段简短的文字描述,这个链接的功能就是将这个帐户的状态修改成激活状态。这个功能的重点在于如何生成这个激活帐户的链接。直接可以联想到的方法就是建一个Servlet,Servlet接收一个用户名参数,Servlet拿到用户名参数之后,到数据库把这条记录load出来,做一次update操作即可。但是这样做会有风险,比如有人想在你的网站上搞破坏,注册时他填的email地址就是乱填的,这个Email地址可能根据就收不到邮件(但符合email格式),注册完成之后,然后在浏览器地址栏输入网站之前发送的帐户激活链接,并加上新注册的用户名参数,这样一来就跳过了去邮箱激活的步聚,时间久了,库中可能会留下许多无效的email地址和帐户。为了避免这个问题,解决方案是在用户注册成功之后,在发送激活帐户的链接中加一个随机码,这个随机码是将用户名和一个随机数用md5加密后的一串16进制字符串,每次用户在激活帐户的时候,都验证这个随机码是否和注册时发送的一致,这样就可以避免人为的修改激活链接达到帐户激活的功能。


二、忘记密码


          当你在某网站注册一个帐户之后,发现这个帐户很久没用了,密码也忘记了,如果还记得之前注册时填写的Email,那就可以向你的email中发一个重设密码的链接,就可以重新设置你的密码。大部份网站一般都提供了根据Email找回密码的功能。实现此功能的思路:在登录界面添加一个“忘记密码“的链接,用户点击进去之后,输入用户名或Email,系统根据用户名或Email找出用户信息,并生成一个重新设置密码的链接发送到用户的邮箱中(生成链接的方式和生成帐户激活链接的方式一样),用户在邮箱中点击重设密码的链接,根据提示进入密码重设页面,重新输入新的密码即可。

功能实现步聚(帐号激活):

1、用户注册页面

 

[html] view plaincopy
  1. <form action="${pageContext.request.contextPath}/register" method="post">  
  2.     用户名:<input type="text" name="userName" value="${param.userName}"><span class="error">${errors.userName}</span><br/>  
  3.     密码:<input type="password" name="password" ><span class="error">${errors.password}</span><br/>  
  4.     确认密码:<input type="password" name="password2"><span class="error">${errors.password2}</span><br/>  
  5.     email:<input type="text" name="email" value="${param.email}"><span class="error">${errors.email}</span><br/>  
  6.     <input type="submit" value="注册">  
  7. </form>  

 

2、处理注册请求的Servlet(RegisterServlet)

 

[java] view plaincopy
  1. package org.study.accountactivate.web.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.study.accountactivate.dao.UserDao;  
  13. import org.study.accountactivate.dao.impl.UserDaoImpl;  
  14. import org.study.accountactivate.domail.User;  
  15. import org.study.accountactivate.util.EmailUtils;  
  16.   
  17. /** 
  18.  * 用户注册 
  19.  */  
  20. public class RegisterServlet extends HttpServlet {  
  21.     private static final long serialVersionUID = 1L;  
  22.       
  23.     private UserDao userDao = UserDaoImpl.getInstance();  
  24.          
  25.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  26.         doPost(request, response);  
  27.     }  
  28.   
  29.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  30.         String userName = request.getParameter("userName");  
  31.         String password = request.getParameter("password");  
  32.         String password2 = request.getParameter("password2");  
  33.         String email = request.getParameter("email");  
  34.           
  35.         Map<String, String> errors = new HashMap<String,String>();  
  36.         if (userName == null || "".equals(userName)) {  
  37.             errors.put("userName""用户名不能为空!");  
  38.         } else if (userName != null && userDao.findUserByName(userName) != null) {  
  39.             errors.put("userName""该用户已注册!");  
  40.         }  
  41.           
  42.         if (password == null || "".equals(password)) {  
  43.             errors.put("password","密码不能为空!");  
  44.         } else if (password != null && password.length() < 3) {  
  45.             errors.put("password","密码长度不能低于3位!");  
  46.         }  
  47.           
  48.         if (password2 == null || "".equals(password2)) {  
  49.             errors.put("password2""确认密码不能为空!");  
  50.         } else if (password2 != null && !password2.equals(password)) {  
  51.             errors.put("password2""两次输入的密码不一致!");  
  52.         }  
  53.           
  54.         if (email == null || "".equals(email)) {  
  55.             errors.put("email""email不能为空!");  
  56.               
  57.         } else if (email != null && !email.matches("[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-])*")) {  
  58.             errors.put("email""email格式不正确!");  
  59.         }  
  60.           
  61.         if (!errors.isEmpty()) {  
  62.             request.setAttribute("errors", errors);  
  63.             request.getRequestDispatcher("/registerUI").forward(request, response);  
  64.             return;  
  65.         }  
  66.           
  67.         User user = new User();  
  68.         user.setUserName(userName);  
  69.         user.setPassword(password);  
  70.         user.setEmail(email);  
  71.         user.setActivated(false);  
  72.           
  73.         userDao.addUser(user);  
  74.           
  75.         // 注册成功后,发送帐户激活链接  
  76.         EmailUtils.sendAccountActivateEmail(user);  
  77.           
  78.         // 注册成功直接将当前用户保存到session中  
  79.         request.getSession().setAttribute("user", user);  
  80.         request.getRequestDispatcher("/WEB-INF/pages/registerSuccess.jsp").forward(request,response);  
  81.     }  
  82. }  

 

 

3、激活帐户的Servlet(ActivateAccountServle)

 

[java] view plaincopy
  1. package org.study.accountactivate.web.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.study.accountactivate.dao.UserDao;  
  10. import org.study.accountactivate.dao.impl.UserDaoImpl;  
  11. import org.study.accountactivate.domail.User;  
  12. import org.study.accountactivate.util.GenerateLinkUtils;  
  13.   
  14. /** 
  15.  * 帐户激活 
  16.  */  
  17. public class ActivateAccountServlet extends HttpServlet {  
  18.     private static final long serialVersionUID = 1L;  
  19.          
  20.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  21.         String idValue = request.getParameter("id");  
  22.         int id = -1;  
  23.         try {  
  24.             id = Integer.parseInt(idValue);  
  25.         } catch (NumberFormatException e) {  
  26.             throw new RuntimeException("无效的用户!");  
  27.         }  
  28.         UserDao userDao = UserDaoImpl.getInstance();  
  29.         User user = userDao.findUserById(id);// 得到要激活的帐户  
  30.         user.setActivated(GenerateLinkUtils.verifyCheckcode(user, request));// 校验验证码是否和注册时发送的一致,以此设置是否激活该帐户  
  31.         userDao.updateUser(user);  
  32.           
  33.         request.getSession().setAttribute("user", user);  
  34.           
  35.         request.getRequestDispatcher("/accountActivateUI").forward(request, response);  
  36.     }  
  37.   
  38.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  39.         doGet(request, response);  
  40.     }  
  41. }  
4、操作用户的DAO接口与实现类(UserDao和UserDaoImpl类)

 

[java] view plaincopy
  1. package org.study.accountactivate.dao;  
  2.   
  3. import org.study.accountactivate.domail.User;  
  4.   
  5. public interface UserDao {  
  6.   
  7.     void addUser(User user);  
  8.       
  9.     void updateUser(User user);  
  10.       
  11.     User findUserById(int id);  
  12.       
  13.     User findUserByName(String userName);  
  14.       
  15.     User findUserByNameOrEmail(String nameOrEmail);  
  16. }  
  17.   
  18. package org.study.accountactivate.dao.impl;  
  19.   
  20. import java.util.Collection;  
  21. import java.util.HashMap;  
  22. import java.util.Iterator;  
  23. import java.util.Map;  
  24. import java.util.UUID;  
  25.   
  26. import org.study.accountactivate.dao.UserDao;  
  27. import org.study.accountactivate.domail.User;  
  28.   
  29. public class UserDaoImpl implements UserDao {  
  30.       
  31.     private static UserDaoImpl instance = new UserDaoImpl();  
  32.       
  33.     private UserDaoImpl() {}  
  34.       
  35.     public static UserDaoImpl getInstance() {  
  36.         return instance;  
  37.     }  
  38.       
  39.     Map<Integer,User> users = new HashMap<Integer, User>();  
  40.       
  41.     int nextId = 1;  
  42.   
  43.     @Override  
  44.     public void addUser(User user) {  
  45.         user.setId(nextId++);  
  46.         user.setRandomCode(UUID.randomUUID().toString());  
  47.         users.put(user.getId(), user);  
  48.     }  
  49.   
  50.     @Override  
  51.     public void updateUser(User user) {  
  52.         users.put(user.getId(), user);  
  53.     }  
  54.   
  55.     @Override  
  56.     public User findUserById(int id) {  
  57.         return users.get(id);  
  58.     }  
  59.   
  60.     @Override  
  61.     public User findUserByName(String userName) {  
  62.         Collection<User> userValues = users.values();  
  63.         for (Iterator<User> iterator = userValues.iterator();iterator.hasNext();) {  
  64.             User user = iterator.next();  
  65.             if (user.getUserName().equals(userName)) {  
  66.                 return user;  
  67.             }  
  68.         }  
  69.         return null;  
  70.     }  
  71.   
  72.     @Override  
  73.     public User findUserByNameOrEmail(String nameOrEmail) {  
  74.         Collection<User> userValues = users.values();  
  75.         for(Iterator<User> iterator = userValues.iterator();iterator.hasNext();) {  
  76.             User user = iterator.next();  
  77.             if (user.getEmail().equals(nameOrEmail) || user.getUserName().equals(nameOrEmail)) {  
  78.                 return user;  
  79.             }  
  80.         }  
  81.         return null;  
  82.     }  
  83. }  
5、发送Email的工具类(EmailUtils,用于发送帐户激活链接和密码重置链接)

 

 

[java] view plaincopy
  1. package org.study.accountactivate.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Date;  
  6. import java.util.Properties;  
  7.   
  8. import javax.mail.Authenticator;  
  9. import javax.mail.Message.RecipientType;  
  10. import javax.mail.PasswordAuthentication;  
  11. import javax.mail.Session;  
  12. import javax.mail.Transport;  
  13. import javax.mail.internet.InternetAddress;  
  14. import javax.mail.internet.MimeMessage;  
  15.   
  16. import org.study.accountactivate.domail.User;  
  17.   
  18. public class EmailUtils {  
  19.       
  20.     private static final String FROM = "xyang81@163.com";  
  21.   
  22.     /** 
  23.      * 注册成功后,向用户发送帐户激活链接的邮件 
  24.      * @param user 未激活的用户 
  25.      */  
  26.     public static void sendAccountActivateEmail(User user) {  
  27.         Session session = getSession();  
  28.         MimeMessage message = new MimeMessage(session);  
  29.         try {  
  30.             message.setSubject("帐户激活邮件");  
  31.             message.setSentDate(new Date());  
  32.             message.setFrom(new InternetAddress(FROM));  
  33.             message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));  
  34.             message.setContent("<a href='" + GenerateLinkUtils.generateActivateLink(user)+"'>点击激活帐户</a>","text/html;charset=utf-8");  
  35.             // 发送邮件  
  36.             Transport.send(message);  
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  
  41.       
  42.     /** 
  43.      * 发送重设密码链接的邮件 
  44.      */  
  45.     public static void sendResetPasswordEmail(User user) {  
  46.         Session session = getSession();  
  47.         MimeMessage message = new MimeMessage(session);  
  48.         try {  
  49.             message.setSubject("找回您的帐户与密码");  
  50.             message.setSentDate(new Date());  
  51.             message.setFrom(new InternetAddress(FROM));  
  52.             message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));  
  53.             message.setContent("要使用新的密码, 请使用以下链接启用密码:<br/><a href='" + GenerateLinkUtils.generateResetPwdLink(user) +"'>点击重新设置密码</a>","text/html;charset=utf-8");  
  54.             // 发送邮件  
  55.             Transport.send(message);  
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.     }  
  60.       
  61.     public static Session getSession() {  
  62.         Properties props = new Properties();  
  63.         props.setProperty("mail.transport.protocol""smtp");  
  64.         props.setProperty("mail.smtp.host""smtp.163.com");  
  65.         props.setProperty("mail.smtp.port""25");  
  66.         props.setProperty("mail.smtp.auth""true");  
  67.         Session session = Session.getInstance(props, new Authenticator() {  
  68.             @Override  
  69.             protected PasswordAuthentication getPasswordAuthentication() {  
  70.                 String password = null;  
  71.                 InputStream is = EmailUtils.class.getResourceAsStream("password.dat");  
  72.                 byte[] b = new byte[1024];  
  73.                 try {  
  74.                     int len = is.read(b);  
  75.                     password = new String(b,0,len);  
  76.                 } catch (IOException e) {  
  77.                     e.printStackTrace();  
  78.                 }  
  79.                 return new PasswordAuthentication(FROM, password);  
  80.             }  
  81.               
  82.         });  
  83.         return session;  
  84.     }  
  85. }  

 

6、生成帐户激活、密码重设链接的工具类(GenerateLinkUtils)

[java] view plaincopy
  1. package org.study.accountactivate.util;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5.   
  6. import javax.servlet.ServletRequest;  
  7.   
  8. import org.study.accountactivate.domail.User;  
  9.   
  10. /** 
  11.  * 生成帐户激活、重新设置密码的链接 
  12.  */  
  13. public class GenerateLinkUtils {  
  14.       
  15.     private static final String CHECK_CODE = "checkCode";  
  16.       
  17.     /** 
  18.      * 生成帐户激活链接 
  19.      */  
  20.     public static String generateActivateLink(User user) {  
  21.         return "http://localhost:8080/AccountActivate/activateAccount?id="   
  22.                 + user.getId() + "&" + CHECK_CODE + "=" + generateCheckcode(user);  
  23.     }  
  24.       
  25.     /** 
  26.      * 生成重设密码的链接 
  27.      */  
  28.     public static String generateResetPwdLink(User user) {  
  29.         return "http://localhost:8080/AccountActivate/resetPasswordUI?userName="   
  30.                 + user.getUserName() + "&" + CHECK_CODE + "=" + generateCheckcode(user);  
  31.     }  
  32.       
  33.     /** 
  34.      * 生成验证帐户的MD5校验码 
  35.      * @param user  要激活的帐户 
  36.      * @return 将用户名和密码组合后,通过md5加密后的16进制格式的字符串 
  37.      */  
  38.     public static String generateCheckcode(User user) {  
  39.         String userName = user.getUserName();  
  40.         String randomCode = user.getRandomCode();  
  41.         return md5(userName + ":" + randomCode);  
  42.     }  
  43.       
  44.     /** 
  45.      * 验证校验码是否和注册时发送的验证码一致 
  46.      * @param user 要激活的帐户 
  47.      * @param checkcode 注册时发送的校验码 
  48.      * @return 如果一致返回true,否则返回false 
  49.      */  
  50.     public static boolean verifyCheckcode(User user,ServletRequest request) {  
  51.         String checkCode = request.getParameter(CHECK_CODE);  
  52.         return generateCheckcode(user).equals(checkCode);  
  53.     }  
  54.   
  55.     private static String md5(String string) {  
  56.         MessageDigest md = null;  
  57.         try {  
  58.             md = MessageDigest.getInstance("md5");  
  59.             md.update(string.getBytes());  
  60.             byte[] md5Bytes = md.digest();  
  61.             return bytes2Hex(md5Bytes);  
  62.         } catch (NoSuchAlgorithmException e) {  
  63.             e.printStackTrace();  
  64.         }  
  65.           
  66.         return null;  
  67.     }  
  68.       
  69.     private static String bytes2Hex(byte[] byteArray)  
  70.     {  
  71.         StringBuffer strBuf = new StringBuffer();  
  72.         for (int i = 0; i < byteArray.length; i++)  
  73.         {  
  74.             if(byteArray[i] >= 0 && byteArray[i] < 16)  
  75.             {  
  76.                 strBuf.append("0");  
  77.             }  
  78.             strBuf.append(Integer.toHexString(byteArray[i] & 0xFF));  
  79.         }  
  80.         return strBuf.toString();  
  81.     }  
  82. }  

7、实体类(User)

 

[java] view plaincopy
  1. package org.study.accountactivate.domail;  
  2.   
  3. public class User {  
  4.     // 编号  
  5.     private int id;  
  6.     // 用户名  
  7.     private String userName;  
  8.     // 密码  
  9.     private String password;  
  10.     // email  
  11.     private String email;  
  12.     // 是否激活  
  13.     private boolean activated;  
  14.     // 随机码(激活帐户与生成重设密码链接时使用)  
  15.     private String randomCode;  
  16.       
  17.     public int getId() {  
  18.         return id;  
  19.     }  
  20.     public void setId(int id) {  
  21.         this.id = id;  
  22.     }  
  23.     public String getUserName() {  
  24.         return userName;  
  25.     }  
  26.     public void setUserName(String userName) {  
  27.         this.userName = userName;  
  28.     }  
  29.     public String getPassword() {  
  30.         return password;  
  31.     }  
  32.     public void setPassword(String password) {  
  33.         this.password = password;  
  34.     }  
  35.     public boolean isActivated() {  
  36.         return activated;  
  37.     }  
  38.     public void setActivated(boolean activated) {  
  39.         this.activated = activated;  
  40.     }  
  41.     public String getRandomCode() {  
  42.         return randomCode;  
  43.     }  
  44.     public void setRandomCode(String randomCode) {  
  45.         this.randomCode = randomCode;  
  46.     }  
  47.     public String getEmail() {  
  48.         return email;  
  49.     }  
  50.     public void setEmail(String email) {  
  51.         this.email = email;  
  52.     }  
  53.   
  54. }  

 

功能实现步骤(忘记密码):

1、登录页面

 

[html] view plaincopy
  1. <form action="${pageContext.request.contextPath}/login" method="post">  
  2.     <span class="error" style="display: block;">${errors.loginError}</span>  
  3.     用户名:<input type="text" name="userName" value="${param.userName}"><span class="error">${errors.userName}</span><br/>  
  4.     密码:<input type="password" name="password"><span class="error">${errors.password}</span><br/>  
  5.     <input type="submit" value="登录">   
  6.     <a href="${pageContext.request.contextPath}/forgotPwdUI">忘记密码?</a>   
  7.     <a href="${pageContext.request.contextPath}/registerUI">注册</a>  
  8. </form>  

 

2、发送重设密码申请的页面

 

[html] view plaincopy
  1. <form action="${pageContext.request.contextPath}/forgotPwd" method="post">  
  2.     <span style="color: red">${requestScope.sendMailMsg}</span>  
  3.     用户名/邮箱:<input type="text" name="userNameOrEmail" /><span style="color: red">${requestScope.errorMsg}</span><br/>  
  4.     <input type="submit" value="提交" /><a href=""></a>  
  5. </form>  

 

3、处理“发送重设密码链接“请求的Servlet(ForgotPwdServlet)

 

[java] view plaincopy
  1. package org.study.accountactivate.web.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.study.accountactivate.dao.UserDao;  
  10. import org.study.accountactivate.dao.impl.UserDaoImpl;  
  11. import org.study.accountactivate.domail.User;  
  12. import org.study.accountactivate.util.EmailUtils;  
  13.   
  14. /** 
  15.  * 发送重设密码申请的链接 
  16.  */  
  17. public class ForgotPwdServlet extends HttpServlet {  
  18.       
  19.     private static final long serialVersionUID = 1L;  
  20.   
  21.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  22.         String userNameOrEmail = request.getParameter("userNameOrEmail");  
  23.         UserDao userDao = UserDaoImpl.getInstance();  
  24.         User user = userDao.findUserByNameOrEmail(userNameOrEmail);  
  25.         if (user == null) {  
  26.             request.setAttribute("errorMsg", userNameOrEmail + ",不存在!");  
  27.             request.getRequestDispatcher("/forgotPwdUI").forward(request, response);  
  28.             return;  
  29.         }  
  30.           
  31.         // 发送重新设置密码的链接  
  32.         EmailUtils.sendResetPasswordEmail(user);  
  33.           
  34.         request.setAttribute("sendMailMsg""您的申请已提交成功,请查看您的"+user.getEmail()+"邮箱。");  
  35.           
  36.         request.getRequestDispatcher("/WEB-INF/pages/forgotPwdSuccess.jsp").forward(request, response);  
  37.     }  
  38.   
  39.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  40.         doGet(request, response);  
  41.     }  
  42. }  
4、重新设置密码的页面

 

[html] view plaincopy
  1. <form action="${pageContext.request.contextPath}/resetPassword" method="post">  
  2.     <span class="error" style="display: block;">${errors.passwordError}</span>  
  3.     用户名:<input type="text" name="userName" value="${userName}" readonly="readonly"/><br/>  
  4.     新密码:<input type="password" name="newPassword" /><span class="error">${errors.newPassword }</span><br/>  
  5.     确认新密码:<input type="password" name="newPassword2"/><span class="error">${errors.newPassword2 }</span><br/>  
  6.     <input type="submit" value="修改" />  
  7. </form>  
5、处理重新设置密码请求的Servlet(ResetPasswordServlet)
[java] view plaincopy
  1. package org.study.accountactivate.web.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.study.accountactivate.dao.UserDao;  
  13. import org.study.accountactivate.dao.impl.UserDaoImpl;  
  14. import org.study.accountactivate.domail.User;  
  15.   
  16. /** 
  17.  * 重新设置密码 
  18.  */  
  19. public class ResetPasswordServlet extends HttpServlet {  
  20.     private static final long serialVersionUID = 1L;  
  21.          
  22.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  23.         String userName = request.getParameter("userName");  
  24.         String newPassword = request.getParameter("newPassword");  
  25.         String newPassword2 = request.getParameter("newPassword2");  
  26.         Map<String,String> errors = new HashMap<String, String>();  
  27.         if (newPassword == null || "".equals(newPassword)) {  
  28.             errors.put("newPassword""新密码不能为空!");  
  29.         }  
  30.           
  31.         if (newPassword2 == null || "".equals(newPassword2)) {  
  32.             errors.put("newPassword2""确认新密码不能为空!");  
  33.         }  
  34.           
  35.         if (!newPassword.equals(newPassword2)) {  
  36.             errors.put("passwordError""两次输入的密码不一致!");  
  37.         }  
  38.           
  39.         if (!errors.isEmpty()) {  
  40.             request.setAttribute("errors", errors);  
  41.             request.getRequestDispatcher("/resetPasswordUI?userName=" + userName).forward(request, response);  
  42.             return;  
  43.         }  
  44.           
  45.         UserDao userDao = UserDaoImpl.getInstance();  
  46.         User user = userDao.findUserByName(userName);  
  47.         user.setPassword(newPassword);  
  48.           
  49.         request.getRequestDispatcher("/WEB-INF/pages/resetPasswordSuccess.jsp").forward(request, response);  
  50.           
  51.     }  
  52.   
  53.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  54.         doGet(request, response);  
  55.     }  
  56. }  

 

帐户激活操作流程:

1)、注册页面

  

2)、注册成功页面

 

3)、帐户未激活,登录后的界面

4)、前往邮箱中激活帐户

5)、激活成功

6)、帐户已激活,登录后的界面

 

忘记密码操作流程:

1)、登录页面(点击“忘记密码”链接,进入重设密码页面)

2、重设密码申请页面(输入用户名或邮箱,点击“提交”按钮)

3、重设密码申请成功页面

4、邮箱中重设密码的链接

5、重新设置密码页面

6、密码重新设置成功页面

分享到:
评论
1 楼 cash23 2013-12-05  
请问这个,有做好的工程案例直接提供下载吗

相关推荐

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    JavaMail帐号激活与忘记密码实例源码

    本实例源码主要关注的是两个核心功能:帐号激活和忘记密码的处理。 首先,让我们深入理解这两个功能的实现: 1. **帐号激活**: 在用户注册新账户后,通常会收到一封包含激活链接或验证码的邮件。这个过程是确保...

    Java程序设计技巧与开发实例.rar

    Java程序设计技巧与开发实例Java程序设计技巧与开发实例Java程序设计技巧与开发实例Java程序设计技巧与开发实例Java程序设计技巧与开发实例

    JAVA3D官方实例

    JAVA3D官方实例对于初学者来说是一份宝贵的资源,它不仅能够帮助理解JAVA3D的基本概念,还能够通过实例演示如何在Eclipse这样的集成开发环境中实际操作。 首先,JAVA3D的核心在于其面向对象的编程模型,它允许...

    Java源码包100个设计实例.zip

    Java二进制IO类与文件复制操作实例.rar Java从压缩包中提取文件.rar Java从网络取得文件.rar Java仓库管理系统,Access数据库.rar Java仿Vista界面风格的登录窗口.rar Java仿千千静听音乐播放器源代码.rar Java企业...

    Java网络编程 JAVA web开发实例讲解 宠物分类展现web项目 实战讲解 全套PPT课件 共10个章节.rar

    Java网络编程 JAVA web开发实例讲解 宠物分类展现web项目 第01章 项目背景知识(共15页).ppt Java网络编程 JAVA web开发实例讲解 宠物分类展现web项目 第02章 用HTML+CSS实现宠物分类展现静态网页版本(共44页)....

    JAVA图形用户界面设计与实例

    JAVA图形用户界面设计与实例.pdf JAVA图形用户界面设计与实例.pdf

    java源码包实例源码JAVA开发源码55个合集.zip

    java源码包J实例源码JAVA开发源码55个合集: Java中的Blowfish对称密钥加密算法类和实例.rar Java中的EJB编程实例代码.rar Java中的SSL及HTTPS协议实例源码.rar Java写的ATM机取款模拟程序.zip Java写的一个mp3播放器...

    JAVA图形用户界面设计与实例 陈家兴等 2004年.pdf

    《JAVA图形用户界面设计与实例》是陈家兴等作者在2004年出版的一本关于Java GUI设计的书籍。该书很可能涉及到使用Java编程语言开发图形用户界面(Graphical User Interface,简称GUI)的知识点,以及通过实例来加深...

    JAVA实现ElasticSearch的简单实例

    Java实现Elasticsearch的简单实例主要涉及以下几个关键知识点: 1. **Elasticsearch基础**:Elasticsearch(ES)是一个开源的、分布式全文搜索引擎,它提供了实时数据分析的能力,广泛用于日志分析、监控、搜索应用...

    Java+ajax写的登录实例

    在这个“Java+ajax写的登录实例”中,我们将探讨如何结合这两种技术来实现一个实时验证的用户登录系统。 首先,Java作为后端开发的主要语言,负责处理业务逻辑和数据操作。在这个登录实例中,Java会实现以下功能: ...

    java入门与实例

    "Java入门与实例"针对的是对编程感兴趣的初学者,它提供了通俗易懂的讲解和实践案例,帮助初学者快速掌握Java编程基础。 Java的基础知识点包括: 1. **环境搭建**:首先,学习Java需要安装Java Development Kit ...

    Java_Modbus的操作(实例)

    Java ModBus 操作实例主要涉及了使用Java进行ModBus通信以及串口通信的过程。ModBus是一种广泛应用的工业通信协议,常用于PLC、数采仪等设备之间进行数据交换。在Java环境中,开发者需要实现相应的功能来与这些设备...

    java源码包实例源码JAVA开发源码50个合集.zip

    java源码包实例源码JAVA开发源码50个合集: Ajax框架 ZK.rar Java图书馆管理系统源程序.rar Java图片倒影效果实例源码.rar Java图片翻折,将图像压扁.rar Java坦克大战网络对战版源代码.rar Java声音播放程序源代码....

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java 进销存项目工程实例

    【Java进销存项目工程实例】是一个典型的Java Web应用程序,主要目标是管理和追踪商品的进货、销售和库存情况。这个项目实例适用于教学和学习,它提供了实际操作的平台,帮助初学者理解Java后端开发、数据库设计以及...

    java生成word的实例 java导出Word文档的实例

    这个实例将带你了解如何在Java环境中使用API来创建和导出Word文档。以下是一些关键的知识点: 1. **Apache POI库**: Apache POI是Java社区开发的一个开源项目,提供了读写Microsoft Office格式文件的能力,包括...

    JAVA源码Java数据压缩与传输实例JAVA源码Java数据压缩与传输实例

    JAVA源码Java数据压缩与传输实例JAVA源码Java数据压缩与传输实例

    Java 2 入门与实例教程pdf

    Java 2 入门与实例教程pdf,

    Java程序设计与实例源代码

    本资料包“Java程序设计与实例源代码”提供了一套全面的学习资源,包括高清PDF教程和丰富的实例源代码,旨在帮助学习者深入理解和实践Java编程。 在Java程序设计中,首先需要了解基础语法,包括变量、数据类型、...

Global site tag (gtag.js) - Google Analytics