zoukankan      html  css  js  c++  java
  • JavaMail学习笔记(七)、帐号激活与忘记密码 实例(zhuan)

    一、帐户激活

     

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

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

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

    二、忘记密码

     

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

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

    1、用户注册页面

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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.     <href="${pageContext.request.contextPath}/forgotPwdUI">忘记密码?</a>   
    7.     <href="${pageContext.request.contextPath}/registerUI">注册</a>  
    8. </form>  

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

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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="提交" /><href=""></a>  
    5. </form>  

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

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 plain copy
     
     在CODE上查看代码片派生到我的代码片
    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、密码重新设置成功页面

    源码下载地址:http://download.csdn.net/detail/xyang81/4510396

    http://blog.csdn.net/xyang81/article/details/7727141

  • 相关阅读:
    496 服务器渲染 VS 客户端渲染
    495 队列,优先级队列
    493 JS中数据类型检测的四种方案
    492 js的继承:原型继承,CALL继承,寄生组合式继承,ES6中的类和继承
    491 CALL和APPLY以及BIND语法(含BIND的核心原理),CALL和APPLY的应用(类数组借用数组原型方法),CALL源码解析及阿里面试题
    490 JavaScript的this的五种指向
    488 DOM0和DOM2事件绑定的原理、使用、区别
    487 函数的三种角色:普通函数,构造函数(类),普通对象,原型链清明上河图
    486 原型及原型链模式:3个重要知识点,从面向对象角度来讲解内置类,hasOwnProperty,原型链方法中的THIS问题,基于内置类的原型扩展方法
    485 面向对象:单例设计模式,工厂模式,什么是面向对象,构造函数,instanceof,构造函数中的局部变量以及new构造函数时不加括号
  • 原文地址:https://www.cnblogs.com/softidea/p/5348804.html
Copyright © 2011-2022 走看看