<아이디, 비밀번호 찾기>
- View(jsp 페이지)
findId.jsp : 아이디 찾기 화면
findIdAfter.jsp : 아이디 찾기 성공 화면
findpw.jsp : 비밀번호 찾기 화면
findpwAfter.jsp : 비밀번호 찾기 성공 화면
- Model
MemberDAO : 회원과 관련하여 SQL문 실행
- Controller(서블릿)
findIdAction : 아이디 찾기 로직 처리
findPasswordAction : 비밀번호 찾기 로직 처리
-----------------------------------------------------
1. 아이디 찾기 화면

2. 아이디 찾기 성공화면

3. 비밀번호 찾기 화면

4. 비밀번호 찾기 성공 화면

--------------------------------------------------------------------------
* 비밀번호 찾기 성공시
- 비밀번호 전체를 보여주는 것은 보안에 취약함으로 앞자리에서 4번째 위치까지만 보여준다.
1. 아이디 찾기 화면
<form class="form-horizontal" role="form" method="POST" action="starters?cmd=findIdAction">
...
<div class="row">
<div class="col-md-10 inputbb">
<div class="form-group has-danger">
<div class="input-group mb-2 mr-sm-2 mb-sm-0">
<input type="text" name="name" class="form-control" id="name" placeholder="이름" required autofocus>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10 inputbb">
<div class="form-group">
<div class="input-group mb-2 mr-sm-2 mb-sm-0">
<input type="email" name="email" class="form-control" id="email" placeholder="이메일" required>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10 inputbb">
<button type="submit" class="btn btn-outline-secondary findbtn">찾기</button>
</div>
</div>
</form>
2. 비밀번호 찾기 화면
<div class="password_container">
<form class="form-horizontal" role="form" method="POST">
<div class="form">
<div class="row">
<div class="col-md-12 h2m">
<h2>비밀번호 찾기</h2>
<h6>회원가입 시 사용한 비밀번호는 <strong>${fn:substring(pw, 0, 4)}
<c:forEach begin="1" end="${fn:length(pw)-4}">
*
</c:forEach>
</strong>입니다.</h6>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10 inputbb">
<!-- <a type="submit" class="btn loginbtn" href="starters?cmd=login">로그인 화면으로 돌아가기</a> -->
<button type="button" class="btn btn-outline-secondary loginbtn" onclick = "backToLogin()">로그인 화면으로 돌아가기</button>
</div>
</div>
</form>
</div>
** 비밀번호 앞에서 4번째 자리까지만 보여주기
- jstl functions 이용
(1) jstl이란 표준 태그 라이브러리로 여러 프로그램이 공통으로 사용하는 코드들의 집합이다.
(2) <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>을 최상단에 선언해야 사용 가능
(3) 라이브러리만 추가해서 가져다 사용하면 된다.
- ${fn:substring(string, begin, end)} 적용
문법: string에서 start인덱스부터 시작해서 end인덱스에 끝나는 부분까지 문자열을 반환한다.
- fn:length(item) 적용
문법: item이 배열이나 컬렉션이면 요소의 개수를 반환하고,
문자열이면 문자의 개수를 반환한다.
** 4번째 자리 이후는 그 길이만큼 *로 보여줌
- <c:forEach> ... </c:forEach> 사용
문법:
<c:forEach var="변수명" items = "${Collection 객체}" begin="시작 index" end="종료 index" step="반복할 때 이동할 index의 갯수">
...
</c:forEach>
- bigin: 정의되지 않았을 경우 0으로 기본값
- end: 정의되지 않았을 경우 items의 크기 -1
3. MemberDAO
- 아이디 찾을 시 필요조건: 이름, 이메일
- 비밀번호 찾을 시 필요조건: 이름, 이메일, 아이디
// 9. 아이디 찾기
public String findId(String name, String email) {
String id = null;
try {
String sql = "select member_id" + " from member_info" + " where name = ? and" + " email = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, email);
ResultSet rs = pstmt.executeQuery();
String sql2 = "select company_id" + " from company_info" + " where name = ? and" + " email = ?";
PreparedStatement pstmt2 = conn.prepareStatement(sql2);
pstmt2.setString(1, name);
pstmt2.setString(2, email);
ResultSet rs2 = pstmt2.executeQuery();
if (rs.next())
id = rs.getString("member_info.member_id");
if (rs2.next())
id = rs2.getString("company_info.company_id");
} catch (SQLException e) {
e.printStackTrace();
}
return id;
}
// 10. 비밀번호 찾기
public String findPw(String memberId, String email, String name) {
String pw = null;
try {
String sql = "select passwd" + " from member_info" + " where member_id = ? and" + " email = ? and"
+ " name = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memberId);
pstmt.setString(2, email);
pstmt.setString(3, name);
ResultSet rs = pstmt.executeQuery();
String sql2 = "select passwd" + " from company_info" + " where company_id = ? and" + " email = ? and"
+ " name = ?";
PreparedStatement pstmt2 = conn.prepareStatement(sql2);
pstmt2.setString(1, memberId);
pstmt2.setString(2, email);
pstmt2.setString(3, name);
ResultSet rs2 = pstmt2.executeQuery();
if (rs.next())
pw = rs.getString("member_info.passwd");
if (rs2.next())
pw = rs2.getString("company_info.passwd");
} catch (SQLException e) {
e.printStackTrace();
}
return pw;
}
4. 서블릿
// 9. 비밀번호 찾기 로직
private String findPasswordAction(HttpServletRequest request) throws ServletException, IOException {
dao = new MemberDAO();
String id = request.getParameter("id");
String email = request.getParameter("email");
String name = request.getParameter("name");
String pw = dao.findPw(id, email, name);
request.setAttribute("pw", pw);
if (pw == null)
return "login/findpw.jsp";
return "login/findpwAfter.jsp";
}
// 10. 아이디 찾기 로직
private String findIdAction(HttpServletRequest request) throws ServletException, IOException {
dao = new MemberDAO();
String name = request.getParameter("name");
String email = request.getParameter("email");
String id = dao.findId(name, email);
request.setAttribute("id", id);
if (id == null)
return "login/findId.jsp";
return "login/findIdAfter.jsp";
}
** 생각해보기
- 아이디, 비밀번호 찾기를 실패했을 때 alert창이 뜨면 사용자가 보기에 더 편할 것 같다.