Как отправить значение из DAO обратно в сервлет?

#java #servlets #dao

#java #сервлеты #dao

Вопрос:

У меня проблема с тем, как действовать дальше. Пользователь вводит адрес электронной почты и нажимает забыли пароль. Затем сервлет вызовет Dao, чтобы проверить, существует ли электронная почта или нет, и если она существует, Dao сбросит пароль. Я хочу, чтобы Dao отправил сброшенный пароль обратно в сервлет и перенаправил другой сервлет для отправки электронной почты обратно пользователю со сброшенным паролем. Кто-нибудь может объяснить мне, как я могу это сделать?

Ниже приведен мой CheckEmailForgotDao

 public class CheckEmailForgotDao{

String url = "jdbc:mysql://localhost:3308/mywebapp";
String username = "root";
String password = "root";
String sql = "SELECT * FROM users WHERE email=?";

public boolean check(String uname) {

    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, username, password);
        PreparedStatement st = con.prepareStatement(sql);
        st.setString(1, uname);

        ResultSet rs = st.executeQuery();

        if (rs.next()) {

            String randomPassword = RandomStringUtils.randomAlphanumeric(10);
            String resetsql = "UPDATE users SET password = ? WHERE email = ?";
            PreparedStatement resetst = con.prepareStatement(resetsql);
            resetst.setString(1, randomPassword);
            resetst.setString(2, uname);

            System.out.println(resetst);
            resetst.executeUpdate();

        }

        return true;

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return false;
}

}
 

Ниже приведен мой сервлет

 @WebServlet("/forgotpassword")
public class ResetPasswordServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public ResetPasswordServlet() {
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String recipient = request.getParameter("email");
    String uname = recipient;

    CheckEmailForgotDao dao = new CheckEmailForgotDao();
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    if (dao.check(uname)) {

        request.getRequestDispatcher("/SendEmailResetPassword").include(request, response);
        
    } else {

        request.getRequestDispatcher("index.html").include(request, response);
        out.println("<script>document.getElementById('err-forgot').innerHTML= 'Email does not exist!'; </script>");

    }

}

}
 

Ответ №1:

Наконец-то я могу это сделать. ниже приведен мой код.

-ForgotpasswordServlet -> CheckEmailForgot

-CheckEmailForgot -> проверить наличие электронной почты -> Сбросить пароль ->

-ForgotpasswordServlet -ForgotpasswordServlet -> Запрос пароля с помощью электронной почты -> EmailForgotDao

-EmailForgotDao -> SendEmail -> ForgotpasswordServlet -> Показать отправленное электронное письмо

 @WebServlet("/forgotpassword")
public class ResetPasswordServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public ResetPasswordServlet() {
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String recipient = request.getParameter("email");
    String uname = recipient;

    CheckEmailForgotDao dao = new CheckEmailForgotDao();

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();     

    if (dao.check(uname)) {

        String url = "jdbc:mysql://localhost:3308/mywebapp";
        String username = "root";
        String password = "root";
        String sql = "SELECT * FROM users WHERE email=?";

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, username, password);
            PreparedStatement st = con.prepareStatement(sql);
            st.setString(1, uname);

            ResultSet rs = st.executeQuery();

            if (rs.next()) {
                String newpassword = rs.getString(3);

                EmailForgotDao emaildao = new EmailForgotDao();
                if (emaildao.sendemailforgot(uname, newpassword)) {

                    request.getRequestDispatcher("index.html").include(request, response);
                    out.println(
                            "<script>document.getElementById('msg-forgot').innerHTML= 'Reset password sent!'; </script>");

                }
            } else {
                request.getRequestDispatcher("index.html").include(request, response);
                out.println(
                        "<script>document.getElementById('msg-forgot').innerHTML= 'Error!'; </script>");
            }

        } catch (Exception e) {

            e.printStackTrace();
        }

    } else {

        request.getRequestDispatcher("index.html").include(request, response);
        out.println("<script>document.getElementById('msg-forgot').innerHTML= 'Email does not exist!'; 
 </script>");

    }

}
 

Приведенный выше сервлет использует ниже CheckEmailForgotDao, чтобы проверить, существует ли электронная почта или нет.

1. Если он существует, этот dao сбросит пароль и вернет true.

2. Если оно не существует, этот dao вернет false, и сервлет покажет, что электронная почта не завершается.

3. Если ниже CheckEmailForgotDao возвращает true, сервлет запросит и получит новый пароль для сброса.

4. Затем сервлет будет использовать это для вызова другого EmailForgotDao.

  public class CheckEmailForgotDao{
 String url = "jdbc:mysql://localhost:3308/mywebapp";
 String username = "root";
 String password = "root";
 String sql = "SELECT * FROM users WHERE email=?";

 public boolean check(String uname) {

    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, username,password);
        PreparedStatement st = con.prepareStatement(sql);
        st.setString(1, uname);

        ResultSet rs = st.executeQuery();

        if (rs.next()) {

            String randomPassword = RandomStringUtils.randomAlphanumeric(10);
            String resetsql = "UPDATE users SET password = ? WHERE email = 
  ?";
            PreparedStatement resetst = con.prepareStatement(resetsql);
            resetst.setString(1, randomPassword);
            resetst.setString(2, uname);

            System.out.println(resetst);
            resetst.executeUpdate();

        }

        return true;

    } catch (Exception e) {
        
        e.printStackTrace();
    }

    return false;
    }
 

Ниже EmailForgotDao отправит электронное письмо и вернет true. Затем сервлет покажет отправленный пароль сброса!

Если оно возвращает false, из-за ошибок, сервлет покажет ошибку.

 public class EmailForgotDao {

public static class SMTPAuthenticator extends Authenticator {
    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("youremail@gmail.com", 
"yourpassword");
    }
}



public boolean sendemailforgot(String uname, String newpassword) {

    String d_uname = "youremail@gmail.com";
    String d_password = "yourpassword";
    String d_host = "smtp.gmail.com";
    int d_port = 465;

    String m_to = uname;
    String m_from = "soemoesmarttoy1@gmail.com";
    String m_subject = "Your Password has been reset";
    String m_text = "Hi your new password is "   newpassword;
    String abc = "text/plain";

    Properties props = new Properties();

    SMTPAuthenticator auth = new SMTPAuthenticator();
    Session ses = Session.getDefaultInstance(props, auth);

    MimeMessage msg = new MimeMessage(ses);

    try {
        msg.setContent(m_text, abc);
        msg.setSubject(m_subject);
        msg.setFrom(new InternetAddress(m_from));
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to));

        Transport transport = ses.getTransport("smtps");
        transport.connect(d_host, d_port, d_uname, d_password);
        transport.sendMessage(msg, msg.getAllRecipients());
        transport.close();
        
        return true;

    } catch (Exception e) {
        System.out.println(e);
        
    }
    
    return false;
}
}