
//전체적인 흐름
findPw.jsp에서 비밀번호 찾기 입력 후 findPwSearch.do로 요청
findPwSearch.do에서 memberId를 검증한 후, checkPw.jsp로 이동하며 memberId를 전달
checkPw.jsp에서 memberId를 유지한 채 비밀번호 변경 폼을 입력
checkPw.do에서 비밀번호를 변경
1.비밀번호 입력창으로 이동
@Controller("memberController")
@RequestMapping("/member")
public class MemberController {
// 비밀번호 찾기
@RequestMapping(value = "/findPw.do", method = {RequestMethod.GET, RequestMethod.POST})
public String findPw() {
return "/member/findPw"; }
2.이름과 아이디, 휴대전화를 입력받아서 일치하는지 확인한다.
// 비밀번호 찾기(입력된 값 찾기)
@RequestMapping(value = "/findPwSearch.do", method = {RequestMethod.GET, RequestMethod.POST})
public String findPwSearch(
@RequestParam("memberName") String memberName,
@RequestParam("memberId") String memberId,
@RequestParam("memberPhone1") String memberPhone1,
@RequestParam("memberPhone2") String memberPhone2,
@RequestParam("memberPhone3") String memberPhone3,
HttpSession session, Model model, RedirectAttributes rAttr, HttpServletRequest request, HttpServletResponse response) throws Exception {
//아이디와 휴대폰번호 확인 로직
MemberDomain memberDomain = new MemberDomain();
memberDomain.setMemberName(memberName);
memberDomain.setMemberId(memberId);
memberDomain.setMemberPhone1(memberPhone1);
memberDomain.setMemberPhone2(memberPhone2);
memberDomain.setMemberPhone3(memberPhone3);
System.out.println("들어온 비밀번호찾기 값들== "+memberDomain);
3.회원조회를 하고 값이 없으면 얼럿띄우고, 다시 입력창으로
//회원 정보 확인
String userId = memberService.findPw(memberDomain);
System.out.println("찾은 아이디 = "+userId);
//값이 없으면
if (userId == null || userId.isEmpty()) { // userId가 없을 경우 예외처리
rAttr.addFlashAttribute("error", "일치하는 회원정보가 없습니다.");
return "redirect:/member/findPw.do";
}
<!-- 비밀번호 찾기 -->
<select id="findPw" resultType="String" parameterType="memberDomain">
<![CDATA[
select memberId from member
where memberName = #{memberName}
and memberId = #{memberId}
and memberPhone1 = #{memberPhone1}
and memberPhone2 = #{memberPhone2}
and memberPhone3 = #{memberPhone3}
]]>
</select>
findPw.jsp
//조회 후 null이나 공백이면 alert띄우기
window.onload =function() {
var errorMsg ="${error}"; //컨트롤러에서 전달된 메시지
if(errorMsg && errorMsg !="") {
alert(errorMsg);
}};
4.값이 있다면 세션에 memberId 저장하고 비밀번호 변경페이지로 이동
// 세션에 memberId 저장
session.setAttribute("memberId", userId);
System.out.println("세션에 저장된 memberId = " + session.getAttribute("memberId"));
return "/member/checkPw"; //컨트롤러 호출할때 redirect
}
5.기존 비밀번호와 새로운 비밀번호를 입력하면
session에 저장한 memberId를 불러오고 ‘새 비밀번호’와 ‘새 비밀번호 재입력’ 맞는지를 확인후 맞다면 memberId와 비밀번호를 DB에 업데이트 보냄
// 비밀번호 수정
@RequestMapping(value = "/checkPw.do", method = {RequestMethod.GET, RequestMethod.POST})
public String checkPw(
@RequestParam("memberPw") String memberPw,
@RequestParam("newPwd") String newPwd,
RedirectAttributes rAttr,
HttpSession session, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 세션에서 memberId 가져오기
String memberId = (String) session.getAttribute("memberId");
if (memberId == null) {
model.addAttribute("error", "세션이 만료되었습니다. 다시 시도해주세요.");
return "/member/checkPw"; // 페이지 그대로 유지
}
// 빈값 체크
if (newPwd == null || newPwd.isEmpty() || memberPw == null || memberPw.isEmpty()) {
model.addAttribute("error", "새 비밀번호를 입력하세요.");
return "/member/checkPw"; // 페이지 유지
}
// 비밀번호 확인 로직
if (!newPwd.trim().equals(memberPw.trim())) {
model.addAttribute("error", "새 비밀번호가 일치하지 않습니다.");
return "/member/checkPw"; // 페이지 유지
}
6.기존 아이디와 비밀번호가 맞다면 새로운 비밀번호로 변경 후, 세션에 저장된 memberId 삭제
// 비밀번호 변경
Map<String, String> updatePw = new HashMap<>();
updatePw.put("memberId", memberId);
updatePw.put("newPwd", newPwd);
memberService.updatePwd(updatePw);
// 비밀번호 변경 후 세션에서 memberId 제거
session.removeAttribute("memberId");
// 비밀번호 변경 성공 메시지
rAttr.addFlashAttribute("message", "비밀번호가 성공적으로 변경되었습니다.");
return "redirect:/member/loginForm.do";
}