전체 흐름 요약
[비밀번호 변경 페이지 요청(GET)] /find/changePassword.do
↓
[ChangePasswordController#doGet]
↓
[세션에서 인증된 UserDTO 조회 후 JSP 전달]
↓
[changePassword.jsp] → 사용자에게 비밀번호 입력 폼 표시
↓
[사용자 입력 후 폼 제출(POST)] /find/changePassword.do
↓
[ChangePasswordController#doPost]
↓ (비밀번호 일치 여부 검사)
↓ (userservice.modifyPassword 호출)
[UserService.modifyPassword]
↓
[UserDAO.updatePassword]
↓ (DB update 쿼리 실행)
↑
[성공 여부 반환]
↑
[doPost] 성공/실패 결과에 따라 알림 후 페이지 이동 및 세션 종료
1) 프론트엔드 — next 버튼 클릭 스크립트
next.onclick = function(event) {
event.preventDefault();
if(nextBtnClick == true) {
location.href = "./changePassword.do";
} else {
alert("인증하세요");
return;
}
}
- 인증 여부(
nextBtnClick 변수) 확인 후, true일 때만 비밀번호 변경 페이지로 이동
- false면 인증 필요 경고
2) ChangePasswordController.java
package kr.co.pamStory.controller.user.find;
import java.io.IOException;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import kr.co.pamStory.dto.UserDTO;
import kr.co.pamStory.service.UserService;
@WebServlet("/find/changePassword.do")
public class ChangePasswordController extends HttpServlet {
private static final long serialVersionUID = 1271233365653325736L;
private UserService userservice = UserService.INSTANCE;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
UserDTO userdto = (UserDTO) session.getAttribute("sessUser");
req.setAttribute("dto", userdto);
// View forward
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/find/changePassword.jsp");
dispatcher.forward(req, resp);
}
- 세션에서 로그인된 사용자 정보를 가져와 JSP로 전달
- JSP에서 아이디 등 사용자 정보 표시
3) JSP (changePassword.jsp) 일부
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>비밀번호 변경</title>
<link rel="stylesheet" href="/farmStory/css/layout_bg.css"/>
<link rel="stylesheet" href="/farmStory/css/find/changePassword.css" />
</head>
<%@ include file="../layout/_header.jsp" %>
<script>
document.addEventListener('DOMContentLoaded', function() {
let pass1 = document.getElementsByName("pass1")[0];
let pass2 = document.getElementsByName("pass2")[0];
let next = document.getElementById("next");
let formRegister = document.getElementsByName("formRegister")[0];
next.onclick = function() {
if (pass1.value !== pass2.value) {
alert("비밀번호가 일치하지 않습니다.");
return false;
} else if (pass1.value === "" || pass2.value === "") {
alert("비밀번호를 입력해 주세요.");
return false;
}
formRegister.submit();
}
});
</script>
<main>
<section>
<form action="/farmStory/find/changePassword.do" method="post" name="formRegister">
<h2>비밀번호 변경</h2>
<table>
<tbody>
<tr>
<td>아이디</td>
<td>${dto.uid}</td>
</tr>
<!-- uid를 서버로 전송하기 위한 hidden 필드 추가 -->
<input type="hidden" name="uid" value="${dto.uid}" />
<tr>
<td>새 비밀번호</td>
<td><input type="password" name="pass1" placeholder="새 비밀번호 입력">
<span class="passResult"></span>
</td>
</tr>
<tr>
<td>새 비밀번호 확인</td>
<td><input type="password" name="pass2" placeholder="새 비밀번호 입력">
</td>
</tr>
</tbody>
</table>
</form>
<p>
비밀번호를 변경해 주세요. <br> 영문, 숫자, 특수문자를 사용하여 8자 이상 입력해 주세요.
</p>
<div>
<a href="/farmStory/find/password.do">취소</a>
<a href="javascript:void(0);" id="next">다음</a>
</div>
</section>
</main>
<%@ include file="../layout/_footer.jsp" %>
pass → password 타입 수정 (보안 및 UX 개선)
- 사용자 입력 비밀번호 일치 여부, 빈칸 체크 후 폼 제출
4) ChangePasswordController.java - doPost 메서드
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 요청 인코딩을 UTF-8로 설정
req.setCharacterEncoding("UTF-8");
// 응답 인코딩을 UTF-8로 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
String uid = req.getParameter("uid");
String pass1 = req.getParameter("pass1");
String pass2 = req.getParameter("pass2");
// 비밀번호 불일치 시 경고창 후 이전 페이지로 이동
if (!pass1.equals(pass2)) {
resp.getWriter().write("<script>alert('비밀번호가 일치하지 않습니다.'); history.back();</script>");
return;
}
// 비밀번호 변경 실행 (boolean 반환)
boolean success = userservice.modifyPassword(uid, pass1);
if (success) {
resp.getWriter().write("<script>alert('비밀번호가 성공적으로 변경되었습니다!'); location.href='/farmStory/user/login.do';</script>");
} else {
resp.getWriter().write("<script>alert('비밀번호 변경 실패. 다시 시도해주세요.'); location.href='/farmStory/find/changePassword.do';</script>");
}
req.getSession().invalidate(); // 세션 종료
}