ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 200923 프로젝트 이메일로 인증코드 발송
    프로젝트 2020. 9. 23. 19:54

     

     

     

     

    어제 선생님이 알려주신 방법으로 이메일 인증번호 발송 구현

    1번페이지

     

    어제 알려주신 방법

     

    다음 아래 페이지에서 

    2번페이지

    인증번호 다시 보내기에서 문제가 생겼다. 인증번호 다시 보내기를 눌렀을때 이전페이지에서 입력받은 이메일 값을 어떻게 가져오느냐가 문제였다.

     

    해결 방법은 1번 페이지에서 이메일을 입력하고 '인증번호 전송' 버튼을 눌렀을때 다음 컨트롤러가 실행된다.

     

     

    컨트롤러 /account/02-sendCode (더보기)

    더보기
    	/* 인증번호 메일보내기 action 페이지 */
    	@RequestMapping(value="/account/02-sendCode", method=RequestMethod.POST)
    	public ModelAndView sendCode(Model model, 
    			HttpServletRequest request, HttpServletResponse response,
    			@RequestParam(value="user_email", required=false) String user_email) throws IOException {
    		
    		String subject = "Cinephile 회원가입 인증번호가 발송되었습니다.";
    		
    		//5자리의 인증번호 생성하기
    		String content = "";
    		
    		for (int i=0; i<6; i++) {
    			content += codeHelper.getInstance().random(0,9); 
    		}
    		
    		Tcodes input = new Tcodes();
    		input.setUser_email(user_email);
    		input.setCode(content);
    		
    		Tcodes output = null;
    		
    		/* tcodes 임시 테이블에 값넣기 , 메일 발송 처리 */
    		try {
    			//인증코드, 메일 임시 테이블에 저장
    			tcodesService.addCode(input);
    			
    			output = tcodesService.getCode(input);
    			// sendMail()메서드 선언시 throws를 정의했기 때문에 예외처리가 요구된다.
    			mailHelper.sendMail(user_email, subject, content);
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    			return webHelper.redirect(null, "메일 발송에 실패했습니다.");
    		}
    		
    		int Pk;
    		Pk = output.getId_code();
    		System.out.println(output.toString());
    		System.out.println("셍썽된 프라이뭐리"+Pk);
    		
    		Cookie cookie = new Cookie("codePk", Integer.toString(Pk)); //저장할 쿠키 객체 생성.
    		
    		cookie.setPath("/");	//쿠키의 유효 경로 --> 사이트 전역에 대한 설정
    		cookie.setDomain("localhost");	//쿠키의 유효 도메인
    		
    		if(Pk == 0) {	//쿠키 시간을 설정하지 않으면 브라우저가 동작하는 동안 유효
    			cookie.setMaxAge(0);	//쿠키 설정시간이 0이면 즉시 삭제된다.
    		}else {
    			cookie.setMaxAge(180);	//값이 있다면 3분 동안 쿠키 저장
    		}
    		
    		response.addCookie(cookie); //쿠키 저장
    		model.addAttribute("user_email", user_email);
    		
    		/* 결과처리 */
    		// import static javax.swing.JOptionPane.*;
    		//showMessageDialog(null,"인증코드를 발송하였습니다.");
    		
    //		PrintWriter out=response.getWriter();
    //		
    //		response.setContentType("text/html; charset=utf-8");
    //		out.println("<script language='javascript'>");
    //		out.println("alert('인증번호를 발송하였습니다.')");
    //		out.println("</script>");
    //		out.flush();
    //		
    //		return new ModelAndView("/account/03-emailCode");
    		return webHelper.redirect(contextPath + "/account/03-emailCode.do", "인증코드를 발송하였습니다." + content);
    		
    	}

    위 컨트롤러의 다음과 같은 부분을 통하여 값을 전달해 주었다.

     

    2번 페이지의 '인증번호 다시 보내기' 버튼을 form으로 바꾸고 그안에 input태그를 만들었고 hidden 타입에 value 값으로 주었더니 해결되었다.

    <form id="sendCodeAgain" method="post" action="${pageContext.request.contextPath}/account/02-sendCode">
    	<div class="nomail">
    		<p>메일을 받지 못하였나요?</p>
    		<input type="hidden" name="user_email" id="user_email" value="${user_email}"/>
    		<button type="submit" class="btn btn-default" id="code_again" >인증번호 다시 보내기</button>
    	</div>
    </form>

    다음은 alert창을 띄우는 문제였는데 자바에서 alert창을 띄우는 방법은 이렇다.(위의 컨트롤러에 이미 써짐)

     

    		PrintWriter out=response.getWriter();
    		
    		response.setContentType("text/html; charset=utf-8");
    		out.println("<script language='javascript'>");
    		out.println("alert('인증번호를 발송하였습니다.')");
    		out.println("</script>");
    		out.flush();
            
    		return new ModelAndView("/account/03-emailCode");

    이렇게 처리하니 해결되었다.

     

    webHelper로 return을 할 경우( model.addAttribute("user_email", user_email); ) 이게 작동을 안함!

     

    그리고 오늘 이 작업을 하나 하면서 배운것은 

    Ajax로 컨트롤러 처리는 @RestController로 해야 된다는거. (jsp ppt 15,16참고)

     

    어제 분명 짚고 넘어 간거 같은데 하...

    아직 멀음 ㅜㅜ

     

    @RestController 는 제이슨으로만? 리턴한다.

     

    아직 인증번호 발송하고 나서 3분의 제한시간 처리는 하지못함

전설의 개발자