일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 자바
- js
- json
- jsp
- jsp 프로젝트
- Level 1
- 다중 카테고리 구현
- 교보문고 따라하기
- jakarta.mail
- SESSION
- 코딩
- MySQL
- Oracle
- 고객센터 구현
- MVC
- 대분류/중분류/소분류
- Sts
- 프로그래머스
- ajax
- 오라클
- Spring MVC
- 세션
- java
- 스프링
- 로그인과 장바구니 구현
- 일단_해보는거야
- 이메일로 인증코드 전송 구현
- 인증코드로 비밀번호 변경 구현
- jquery
- Spring
감 잃지말고 개발하기
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #4. 서버 딴 구현(2) & 비밀번호 변경 페이지 구현 본문
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #4. 서버 딴 구현(2) & 비밀번호 변경 페이지 구현
persii 2023. 4. 25. 16:35회원 관련 로직 중 회원이 비밀번호를 찾고 싶을 때 가입한 이메일로 인증코드를 발송하고, 인증코드를 가지고 회원 비밀번호를 변경하는 로직을 기록하고자 한다.
저번 포스팅에서는 로직 흐름 중 2. 서버 딴 로직을 기록해 보았다.
이번 포스팅에서는 2. 서버 딴 로직에서 "/memberChangePw.me"로 리다이렉트하고 나서의 처리를 마저 구현한 후, 3. 비밀번호 변경 페이지를 구현해보도록 하겠다.
♠ 프로젝트 전체 로직 흐름이 궁금하면 아래 포스팅을 참고하세요 ♠
2023.04.25 - [JSP/MVC] - [JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #1. 구현 틀 잡기
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #1. 구현 틀 잡기
회원 관련 로직 중 비밀번호를 찾고 싶을 때 가입한 이메일로 인증코드를 발송하고, 인증코드를 가지고 회원 비밀번호를 변경하는 로직을 기록하고자 한다. 인증코드로 회원 비밀번호 변경하는
persimmon-ary-stepbystep.tistory.com
로직 흐름
- "/memberChangePw.me"을 해당 컨트롤러가 받아 Action 클래스를 호출한다(MemberFrontController.java).
- Action 클래스에서 세션을 확인하고, 세션 속성에 따라 액션을 취한다(MemberChangePwAction.java).
- 인증코드가 저장된 세션 속성이 있어야 비밀번호 변경 페이지로 이동이 가능하다.
- 비밀번호 변경 페이지에서 사용자는 인증코드와 변경할 새 비밀번호를 입력하고 전송 버튼을 클릭한다.
- JS로 유횻값 검사를 한 후 서버로 보낸다.
로직 흐름 코드 및 실행화면
1. 컨트롤러(MemberFrontController.java)
MemberFrontController 클래스에 아래 코드를 추가한다.
들어온 URL을 매핑하여 MemberChangePwAction 클래스를 호출한다.
// 인증코드 이용, 새 비밀번호 변경 페이지 요청
else if (command.equals("/memberChangePw.me")) {
action = new MemberChangePwAction();
try {
forward = action.execute(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
2. Action 클래스(MemberChangePwAction.java)
해당 Action 클래스에서는 세션 속성을 확인하여
- 로그인 속성값이 없으면서
- 인증코드가 저장된 속성이 있는 경우에만
비밀번호 변경 페이지로 이동될 수 있도록 처리한다.
HttpSession session = req.getSession(false);
- false로 설정하면 브라우저에서 보낸 request에 최근 만들어진 세션 객체가 있으면 그것을 리턴하고, 없으면 NULL을 리턴한다.
Action 클래스 로직 순서
- 브라우저에서 건너온 세션을 확인한다.
- 인증코드가 세션에 저장되어 있으므로 세션이 존재하지 않으면 접근하지 못하도록 해준다.
- 인증코드가 저장된 속성은 MemberForgotPwProAction 클래스에서 생성해 주었다(이전 포스팅 참고).
- 로그인 상태에선 접근하지 못하도록 처리한다.
- 로그인을 처리하는 클래스에서 사용자가 로그인을 하면 세션에 속성 "isLogin"에 true가 저장되도록 만들었기 때문에, 만약 이 isLogin 속성값이 null이 아니면 접근을 못하도록 해준다.
- 이동하는 경로는 "/bookShopMain.ok" (홈 페이지)이다.
- 속성 "isLogin" 값이 null이라면(로그인이 안된 상태), 인증코드가 저장된 속성값을 가져온다.
- 속성값이 있는 경우, 페이지 이동을 설정한다.
- 이동할 경로 : /member/changePwForm.jsp
- 이동할 방식 : Forward
- 속성값이 있는 경우, 페이지 이동을 설정한다.
package action;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import vo.ActionForward;
/** 임시코드를 발급받은 후, 새 비밀번호로 변경하는 페이지 요청을 처리하는 클래스 */
public class MemberChangePwAction implements Action {
@Override
public ActionForward execute(HttpServletRequest req,
HttpServletResponse resp) throws Exception {
ActionForward forward = null;
/* 브라우저에서 건너온 세션 확인
* 로그인 상태에선 접근 못하게 설정 */
HttpSession session = req.getSession(false);
if(session != null) {
// 세션이 생성되어 있는 경우
if((String)session.getAttribute("isLogin") != null) {
// 로그인된 상태
session.invalidate();
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<script>");
out.println("alert('접근 권한이 없습니다.');");
out.println("location.href='/bookShopMain.ok';");
out.println("</script>");
} else {
// 비로그인 상태
String authenticationCode =
(String) session.getAttribute("authenticationCode");
if(authenticationCode != null) {
// 인증코드가 저장된 속성이 있는 경우
forward = new ActionForward();
forward.setPath("/member/changePwForm.jsp");
forward.setRedirect(false);
} else {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<script>");
out.println("alert('잘못된 접근 권한입니다.');");
out.println("location.href='/bookShopMain.ok';");
out.println("</script>");
}
}
} else {
// 세션이 생성되지 않은 경우
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<script>");
out.println("alert('잘못된 접근입니다.');");
out.println("location.href='/bookShopMain.ok';");
out.println("</script>");
}
return forward;
}
}
3. 비밀번호 변경 페이지(changePwForm.jsp)
사용자는 이동한 페이지에서 인증코드와 변경할 새 비밀번호를 입력하고 전송 버튼을 클릭한다.
3-1. ▼ 비밀번호 변경 페이지
요청된 URL은 http://localhost:8090/memberChangePw.me 이다.
3-2. ▼ 비밀번호 변경 페이지 HTML
Form 영역의 코드를 살펴보면 다음과 같다.
submit 버튼을 누르면 Form 데이터가 /memberChangePwPro.me 로 넘어간다.
<div class="col-lg-6">
<div class="login_form_inner">
<h3>비밀번호 변경하기</h3>
<form class="row login_form" action="${request.getContextPath() }/memberChangePwPro.me"
method="post" id="contactForm" name="changePwForm" novalidate="novalidate">
<input type="hidden" name="m_id" value="${m_id }">
<div class="col-md-12 form-group">
<input type="password" class="form-control" id="authenCode" name="authenCode" placeholder="인증번호를 입력하세요"
onfocus="this.placeholder = ''" onblur="this.placeholder = '인증번호를 입력하세요'">
</div>
<div class="col-md-12 form-group">
<input type="password" class="form-control" id="newPw" name="newPw" placeholder="새 비밀번호를 입력하세요"
onfocus="this.placeholder = ''" onblur="this.placeholder = '새 비밀번호를 입력하세요'">
</div>
<div class="col-md-12 form-group">
<input type="password" class="form-control" id="checkPw" name="checkPw" placeholder="새 비밀번호를 한번 더 입력하세요"
onfocus="this.placeholder = ''" onblur="this.placeholder = '새 비밀번호를 한번 더 입력하세요'">
</div>
<div class="col-md-12 form-group">
<button type="button" class="primary-btn" onclick="checkForm();">변경하기</button>
</div>
</form>
</div>
</div>
3-3. ▼ 비밀번호 변경 페이지 JS
"변경하기" 버튼을 클릭하면 호출되는 함수로, 인증코드와 비밀번호 입력 유횻값을 검사한다.
<script type="text/javascript">
function checkForm() {
var authenCode = $('#authenCode').val();
var newPw = $('#newPw').val();
var checkPw = $('#checkPw').val();
if(authenCode == null || authenCode === "" || newPw == null ||
newPw === "" || checkPw == null || checkPw === "") {
alert('모든 입력란을 작성하세요.');
return false;
}
if(newPw !== checkPw) {
alert('비밀번호가 일치하지 않습니다.!');
return false;
}
$('form[name="changePwForm"]').submit();
}
</script>
이렇게 2. 서버 딴 로직과 3. 비밀번호 변경 페이지 구현이 끝났다.
다음 포스팅에서는 구현의 마지막, 비밀번호 변경 페이지에서 건너온 form 정보를 처리하는 서버 딴 로직을 기록해 보도록 하겠다.
끝.
'JSP > MVC' 카테고리의 다른 글
[JSP][MVC][Session] 세션을 이용한 도서 장바구니 구현하기 #2. 장바구니 추가 구현하기 (0) | 2023.05.15 |
---|---|
[JSP][MVC][Session] 세션을 이용한 도서 장바구니 구현하기 #1. 구현 흐름 정리하기 (0) | 2023.05.15 |
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #5. 서버 딴 구현(마지막) (2) | 2023.04.25 |
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #3. 서버 딴 구현(1) (0) | 2023.04.25 |
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #2. 인증코드 발급 페이지 구현 (0) | 2023.04.25 |
[JSP] [MVC] [JAVA] 이메일 전송으로 회원 비밀번호 변경 구현하기 #1. 구현 틀 잡기 (0) | 2023.04.25 |