본문 바로가기
Project/myweb_JAVA

10. 회원 관리 ④ (아이디비밀번호찾기, 회원 탈퇴)

by 개발개발빈이 2022. 9. 20.

○ 아이디 비밀번호 찾기

    ① 아이디/비밀번호 찾기 과정 설명

        1) 이름과 이메일을 입력받아서 일치가 되면
        2) 임시 비밀번호를 발급해서

            - 대문자, 소문자, 숫자를 이용해서 랜덤하게 10글자

            - 생성된 임시 비밀번호를 테이블에서 수정하기
        3) 아이디와 임시 비밀번호를 이메일로 전송하기
        4)  임시비밀번호로 로그인 한 후, 
        5) 본인이 회원 정보 수정에서 비밀번호를 수정한다

    ② DAO : MemberDAO.java → findID()

public boolean findID(MemberDTO dto) {
  boolean flag=false;
  try {
    con=dbopen.getConnection();
    sql=new StringBuilder();

    //이름과 이메일이 일치하는 id 가져오기
    sql.append(" SELECT id ");
    sql.append(" FROM member ");
    sql.append(" WHERE mname=? AND email=? ");
    pstmt = con.prepareStatement(sql.toString());
    pstmt.setString(1, dto.getMname());
    pstmt.setString(2, dto.getEmail());
    rs=pstmt.executeQuery();
        
    if(rs.next()) {//이름과 이메일 일치되었다면
      // 1)아이디
      String id=rs.getString("id");

      // 2)임시 비밀번호(imsiPW) 발급
      //   대문자, 소문자, 숫자를 이용해서 랜던하게 10글자를 만들기
      String[] ch= {//인덱스 0~61
                    "A","B","C","D","E","F","G","H","I","J","K","L","M",
                    "N","O","P","Q","R","S","T","U","V","W","X","Y","Z", 
                    "a","b","c","d","e","f","g","h","i","j","k","l","m",
                    "n","o","p","q","r","s","t","u","v","w","x","y","z", 
                    "0","1","2","3","4","5","6","7","8","9"
      };
            
      //ch배열에서 랜럼하게 10글자 발생
      StringBuilder imsiPW=new StringBuilder();
      for(int i=0; i<10; i++) {
        int num=(int)(Math.random()*ch.length);
        imsiPW.append(ch[num]);
      }

      //임시비밀번호로 테이블 업데이트하기
      sql=new StringBuilder();
      sql.append(" UPDATE member ");
      sql.append(" SET passwd=? ");
      sql.append(" WHERE mname=? AND email=? ");

      pstmt = con.prepareStatement(sql.toString());
      pstmt.setString(1, imsiPW.toString());//임시비밀번호
      pstmt.setString(2, dto.getMname());
      pstmt.setString(3, dto.getEmail());

      int cnt=pstmt.executeUpdate();
      if(cnt==1) {//업데이트 되면, 아이디와 임시비밀번호를 이메일로 전송
        String content="※임시비밀번호는 로그인 후, 변경하시기 바랍니다.";
        content += "<hr>";
        content += "<table border='1'>";
        content += "<tr>";
        content += "	<th>아이디</th>";
        content += "	<td>"+ id + "</td>";
        content += "</tr>";
        content += "<tr>";
        content += "	<th>임시비밀번호</th>";
        content += "	<td>"+ imsiPW.toString() + "</td>";
        content += "</tr>";
        content += "</table>";

        String mailServer="실제 메일서버 주소";
        Properties props=new Properties();
        props.put("mail.smtp.host", mailServer);
        props.put("mail.smtp.auth", true);
        Authenticator myAuth = new MyAuthenticator();
        Session sess=Session.getInstance(props, myAuth);

        InternetAddress[] address={ new InternetAddress(dto.getEmail()) };
        Message msg=new MimeMessage(sess);
        msg.setRecipients(Message.RecipientType.TO, address);
        msg.setFrom(new InternetAddress("받는 사람에게 표시될 이메일 주소"));
        msg.setSubject("myweb 아이디/비번입니다");
        msg.setContent(content, "text/html; charset=UTF-8");
        msg.setSentDate(new Date());
        Transport.send(msg);

        flag=true;//최종적으로 성공

      }else {
        flag=false;
      }
    }
  }catch(Exception e) {
    System.out.println("아이디/비번 찾기 실패: " + e);
  }finally{
    DBclose.close(con, pstmt, rs);
  }	
  return flag;	
}

    ③ 뷰단(정보입력) : main/webapp/member/findID.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../header.jsp"%>
<div class="container">
    <img src="../images/findID.png" style="margin: auto; width: 500px" >
    <form method="post" action="findIDProc.jsp" onsubmit="return findIDCheck()">
      <table class="table table-bordered" id="login_table">
        <tr>
          <th>이름</th>
          <td>
            <input type="text" name="mname" id="mname"
                   class="form-control" placeholder="이름" maxlength="20" required>
          </td>
        </tr>
        <tr>
          <th>이메일</th>
          <td>
            <input type="email" name="email" id="email" 
                   class="form-control" placeholder="이메일" required>
          </td>
        </tr>
        <tr>
          <td colspan="2">
            <input type="submit" value="아이디/비번찾기" class="btn"/>
            <input type="reset"  value="취소" class="btn"/>
          </td>
        </tr>
      </table>
    </form>
</div>
<%@ include file="../footer.jsp"%>

    ④ 뷰단(아이디/비번찾기 결과) : main/webapp/member/findIDProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
  <div class="container">
    <h3>아이디/비번 찾기 결과</h3>
<%    
    String mname=request.getParameter("mname").trim();
    String email=request.getParameter("email").trim();
    dto.setMname(mname);
    dto.setEmail(email);

    boolean flag=dao.findID(dto);
    if(flag==false){
      out.println("<p>이름/이메일을 다시 한번 확인해주세요</p>");
      out.println("<p><a href='javascript:history.back()'>뒤로 가기</a></p>");
    }else{
      String message="";
      message += "아이디/임시비밀번호가 이메일로 전송되었습니다.\\n";
      message += "임시비밀번호는 로그인 후 회원정보 수정에서 수정하시기 바랍니다.";
      out.println("<script>");
      out.println("	alert('" + message + "');");
      out.println("	location.href='loginForm.jsp'");
      out.println("</script>");
    }
%>
  </div>
<%@ include file="../footer.jsp"%>

 

○ 회원탈퇴

    ① DAO : MemberDAO.java → memberWithdraw()

        - 회원 탈퇴를 진행하면 id와 pw가 일치하는 행을 찾아서 mlevel='F1'(탈퇴회원)으로 수정함

        - 보통의 웹사이트들은 회원탈퇴 시에 회원정보를 DB에서 삭제하지 않고 회원레벨을 수정한다고 함

public int memberWithdraw(MemberDTO dto) {
    int cnt=0;
    try {
        con=dbopen.getConnection();

        sql=new StringBuilder();
        sql.append(" UPDATE member ");
        sql.append(" SET mlevel='F1' ");
        sql.append(" WHERE id=? AND passwd=? ");

        pstmt = con.prepareStatement(sql.toString());
        pstmt.setString(1, dto.getId());
        pstmt.setString(2, dto.getPasswd());

        cnt=pstmt.executeUpdate();
    } catch (Exception e) {
        System.out.println("회원 탈퇴 실패: " + e);
    }finally{
        DBclose.close(con, pstmt);
    }			
    return cnt;		
}

    ② 뷰단(비밀번호 입력) : main/webapp/member/memberWithdraw.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="auth.jsp"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
  <img src="../images/memberWithdraw.png" style="margin: auto;" ><br>
  <span style="color:#A68263; font-weight: bold">탈퇴를 진행하기 위해 비밀번호를 다시 확인합니다</span>
  <div class="container">
    <form method="post" action="memberWithdrawProc.jsp" onsubmit="return withdrawCheck()">
        <tr>
          <th>비밀번호</th>
          <td>
            <input type="password" class="form-control" name="passwd" id="passwd" required>
          </td>
        </tr>
        <tr>
          <td colspan="2">
            <input id="memBtn" type="submit" value="회원탈퇴" class="btn">
          </td>
        </tr>
      </table>
    </form>
  </div>
<%@ include file="../footer.jsp"%>

     ②에서 비밀번호 유효성 검사 : myscript.js → withdrawCheck()

function withdrawCheck(){

    var passwd=document.getElementById("passwd").value;
    passwd=passwd.trim();
    if(!(passwd.length>=5 && passwd.length<=10)){
        alert("비밀번호는 5~10글자로 입력해 주세요");
        document.getElementById("passwd").focus();  //비밀번호 칸에 커서 생성
        return false;  
    }

    var message="확인 버튼을 누르면 회원탈퇴됩니다.\n탈퇴를 계속 진행할까요?";
    if(confirm(message)){//확인true, 취소flase
        return true;//서버로 전송
    }else{
        return false;
    }

}

    ④ 뷰단(탈퇴 결과) : main/webapp/member/memberWithdrawProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="auth.jsp"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<h3>회 원 탈 퇴 결 과</h3>
<%	
  String passwd  = request.getParameter("passwd").trim();
	
  dto.setId(s_id);
  dto.setPasswd(passwd);
	
  int cnt = dao.memberWithdraw(dto);	
  if(cnt==0){
    out.println("<p>비밀번호가 일치하지 않습니다</p>");
    out.println("<p><a href='javascript:history.back()'>뒤로 가기</a></p>");
  }else{
    out.println("<script>");
    out.println("  alert('탈퇴가 완료되었습니다');");
    out.println("  location.href='logout.jsp';");  //탈퇴 후 로그아웃 상태 만들기
    out.println("</script>");
  }
%>
<%@ include file="../footer.jsp"%>

 

댓글