[프로젝트 개선] - 웹사이트 제작 21. (Spring/Java) 비밀번호 찾기 (+HttpServletRequest를 이용해 alert 띄우기)

JINI·2023년 6월 25일
0
post-thumbnail

팀프로젝트 당시 비밀번호 찾기 부분에서 아쉬웠던 점이 있었는데 시간부족으로 넘어갔었기 때문에 이번 비밀번호 찾기를 개선하면서 부족한 점을 보완했다.


🚩 변경 전 ➡️ 발급받은 임시 비밀번호로 로그인 실패
🚩 변경 후 ➡️ 발급받은 임시 비밀번호가 암호화 되어 저장
                    (+입력된 정보 오류시 alert 띄우기)


✍️프로젝트 당시 적었던 개선할 점

임시 비밀번호 발급은 되는데 테스트 해보니 
임시 비밀번호값이 아닌 그전 비밀번호로 로그인이 되는 것을 확인....
틀린 코드는 없는 것 같은데 이유를 모르겠다.
좀더 고민을 해봐야 할 것같다.


🪪비밀번호 찾기


☑️ 발급된 임시 비밀번호를 암호화 후 저장

📕controller

BCryptPasswordEncoder pwEncoder; //암호화

public memberController() {
	pwEncoder = new BCryptPasswordEncoder();
}

@PostMapping("findPwdResult")
	public String findPwdCheck(HttpServletRequest request, Model model,
			@RequestParam (required = true, value = "id")String id, @RequestParam(required = true, value = "name") String name,@RequestParam (required = true, value = "email")String email, 
			memberDTO dto) throws IOException {
		try {
			dto.setId(id);
			dto.setName(name);
			dto.setEmail(email);

			int search = ms.pwdCheck(dto);
			
			String newPwd = RandomStringUtils.randomAlphanumeric(10);
			String enpassword = pwEncoder.encode(newPwd); //발급된 임시 비밀번호 암호화시켜 db저장
			dto.setPwd(enpassword );
			ms.pwdUpdate(dto);
			model.addAttribute("newPwd", newPwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "member/findPwdResult";
	}

입력한 정보가 있다면 랜덤 객체로 임시 비밀번호가 발급되고
발급된 비밀번호는 암호화 시킨 후 새로운 비밀번호로 DB에 저장한다.

service,mapper 등 다른 코드는 이전 내용과 같아서 생략했다.



☑️ 비밀번호 변경 전

☑️ 임시 비밀번호 발급

☑️ 발급된 임시 비번이 새로운 비번으로 저장



⚠️ 잘못된 회원 정보 입력시
     HttpServletRequest를 이용해 alert 띄우기

회원 정보를 입력한 후 비밀번호 찾기를 했을 때 해당 정보가 없을 경우
alert창이 뜨고 다시 비밀번호 찾기 페이지로 이동한다.



🚧 1.오류 발생 🚧

원래는 PrintWriter를 이용해서 alert를 띄우는 코드를 작성했는데 여기서 오류가 터졌다.

java.lang.IllegalStateException: 응답이 이미 커밋된 후에는, sendRedirect()를 호출할 수 없습니다.


🚧 2.오류 발생 이유 🚧

위의 코드를 사용했는데
자바스크립트 알림창을 띄우기 전 자바 코드가 먼저 실행 되면서 redirect가 실행되기 때문에 이미 다른 페이지로 이동한 상태라 제대로 동작하지 않아 alert를 띄울 수 없던 것!

즉,response와 sendRedirect를 동시에 사용할 수 없기 때문에 둘 중 하나만 선택해 사용하면 된다.


🚧 3.오류 해결 방법🚧

내 경우는 아예 HttpServletRequest를 이용하기로 했다.

📕controller

@PostMapping("findPwdResult")
	public String findPwdCheck(HttpServletRequest request, Model model,
			@RequestParam (required = true, value = "id")String id, @RequestParam(required = true, value = "name") String name,@RequestParam (required = true, value = "email")String email, 
			memberDTO dto) throws IOException {
            ...생략
if(search == 0) {
	request.setAttribute("msg", "해당 정보가 없습니다. 다시 입력해주세요.");
	request.setAttribute("url", "findPwd");
	return "alert";
}
			...생략
return "member/findPwdResult";
}

📕jsp

<body>
	<script type="text/javascript">
		var msg = "<c:out value='${msg}'/>";
		var url = "<c:out value='${url}'/>";
		alert(msg);
		location.href = url;
	</script>
</body>

HttpServletRequest를 사용해 attribute에 "오류 메세지""redirect url" 값을 넣고 Controller에서 alert.jsp로 보내는 방법으로 alert.jsp에서 경고창을 띄우고 적힌 경로로 페이지가 이동한다.

즉, msg와 url값을 받고 alert 띄운 후에 해당 경로 이동 순으로 실행된다.

profile
꾸준히 성장하는 개발자

0개의 댓글