팀프로젝트가 끝나고 되돌아보는 시간 (1) 이메일 인증을 통한 비밀번호 찾기(수정)
비밀번호 찾기 기능은 총 세 페이지로 구성했습니다.
(비밀번호 찾기 pw_find, 이메일 인증번호 pw_auth, 새 비밀번호 설정 pw_new)
pw_find.jsp (비밀번호 찾기)
<form class = "content" action="pw_auth.me" method="post">
<div class="textbox">
<input id="text" name=name required="" type="text" />
<label for="text">이름</label>
<div class="error">이름을 입력하세요 </div>
</div>
<div class="textbox">
<input id="email" name=email required="/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)?$/i" type="email" />
<label for="email">이메일</label>
<div class="error">유효하지 않은 이메일주소 입니다 </div>
</div><br><br>
<input type="submit" id="check" value="비밀번호찾기">
</form>
label이나 .error 부분은 필수 입력값이기 때문에 유효성 및 css에 적용하기 위해 코딩하였습니다.
이메일을 입력받는 input 태그 타입자체를 email로 주어 ~@~ 형식은 적용되었으나 추가적으로 이메일 형식 (ex. test@test.com)을 적용하도록 했습니다
Controller (인증번호 발송)
@RequestMapping(value = "/pw_auth.me")
public ModelAndView pw_auth(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException {
String email = (String)request.getParameter("email");
String name = (String)request.getParameter("name");
MemberVO vo = memberSV.selectMember(email);
if(vo != null) {
Random r = new Random();
int num = r.nextInt(999999); // 랜덤난수설정
if (vo.getName().equals(name)) {
session.setAttribute("email", vo.getEmail());
String setfrom = "ivedot@naver.com"; // naver
String tomail = email; //받는사람
String title = "[삼삼하개] 비밀번호변경 인증 이메일 입니다";
String content = System.getProperty("line.separator") + "안녕하세요 회원님" + System.getProperty("line.separator")
+ "삼삼하개 비밀번호찾기(변경) 인증번호는 " + num + " 입니다." + System.getProperty("line.separator"); //
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "utf-8");
messageHelper.setFrom(setfrom);
messageHelper.setTo(tomail);
messageHelper.setSubject(title);
messageHelper.setText(content);
mailSender.send(message);
} catch (Exception e) {
System.out.println(e.getMessage());
}
ModelAndView mv = new ModelAndView();
mv.setViewName("YM/pw_auth");
mv.addObject("num", num);
return mv;
}else {
ModelAndView mv = new ModelAndView();
mv.setViewName("YM/pw_find");
return mv;
}
}else {
ModelAndView mv = new ModelAndView();
mv.setViewName("YM/pw_find");
return mv;
}
memberSV.selectMember(email) 로 입력받은 이메일 값이 회원목록에 있는지 확인 후
존재한다면 랜덤숫자(6자리)를 설정하여 인증이메일을 발송합니다
정상적으로 이메일이 전송될 경우 pw_auth(이메일 인증번호 확인 페이지) 에서 랜덤숫자가 정확히 입력되는지 확인해야되기 때문에
ModelAndView 로 페이지 이동했습니다.
이 외에 DB에 랜덤값을 저장하는 방법도 있겠습니다만 일회성값이고 정상적인 이메일 주인이라면 언제고 인증번호를 재발송 받을수 있다는 판단하에 DB에 저장하는 것보단 ModelAndView로 전달하는 것이 효율적이라 생각했습니다.
pw_auth.jsp (이메일 인증번호 확인)
<form action="pw_set.me" method="post">
<input type="hidden" name ="num" value="${num }">
<div class=content>
<div class="textbox">
<input type="text" name="email_injeung" placeholder="인증번호를 입력하세요"><label>인증번호 </label>
<div class="error"> </div>
</div><br><br>
<input type="submit" id="check" value="확인">
</form>
컨트롤러에서 전달받은 랜덤값 num은 hidden으로 처리하고 사용자에게 입력받은 인증번호는 name = email_injeung으로 적용하여
컨트롤러에서 서로 동일한 값인지 확인합니다.
정리하고 있는 시점에서 보니 굳이 컨트롤러가 아니라도 javascript로 num과 email_injeung값이 동일한지 확인하는 이벤트 함수로 처리로 페이지 이동을 처리했어도 되지 않았을까싶습니다.
Controller (인증번호 동일한지 확인)
@RequestMapping(value = "/pw_set.me", method = RequestMethod.POST)
public String pw_set(@RequestParam(value="email_injeung") String email_injeung,
@RequestParam(value = "num") String num) throws IOException{
if(email_injeung.equals(num)) {
return "YM/pw_new";
}
else {
return "YM/pw_find";
}
} //이메일 인증번호 확인
pw_new.jsp (새 비밀번호 설정)
<form action="pw_new.me" method="POST" class="content">
<div class="textbox">
<input id="pw" name="pw" type="password"><label>새비밀번호</label>
<div class="error">
Invalid password
</div>
</div>
<div class="textbox">
<input id="pw2" type="password" onchange="isSame();"><label>새비밀번호 확인</label>
<div class="error">
Invalid password
</div>
</div>
<span id=same></span>
<br><br>
<input type="submit" id="check" value="비밀번호변경">
<input type="hidden" name="email" value=<%=email %>>
</form>
Controller (DB 비밀번호 업데이트)
@RequestMapping(value = "/pw_new.me", method = RequestMethod.POST)
public String pw_new(MemberVO vo, HttpSession session) throws IOException{
int result = memberSV.pwUpdate_M(vo);
if(result == 1) {
return "jj/loginForm";
}
else {
System.out.println("pw_update"+ result);
return "YM/pw_new";
}
}
Mapper (Mybatis)
<!-- 회원정보조회 -->
<select id="selectMember" parameterType="String" resultType="MemberVO">
select * from member_list where email = #{email}
</select>
<!-- 패스워드변경 -->
<update id = "pwUpdate_M" parameterType="MemberVO">
update member_list set pw=#{pw} where email= #{email}
</update>
root-context.xml(이메일 발송 설정)
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com" />
<property name="port" value="465" />
<property name="username" value="보내는 사람 이메일" />
<property name="password" value="이메일 비밀번호" />
<property name="defaultEncoding" value="utf-8" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtps.ssl.checkserveridentity">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
</props>
</property>
</bean>
'Devme > Project' 카테고리의 다른 글
JAVA / SPRING 프로젝트 삼삼하개(5) CHART.JS를 통해 데이터정보 시각화 (2) | 2021.03.02 |
---|---|
JAVA / SPRING 프로젝트 삼삼하개(4) 간편결제 API를 이용하여 결제/환불 기능 구현 (4) | 2021.03.02 |
JAVA / SPRING 프로젝트 삼삼하개(3) 마이페이지(개인/업체) 내 작성글, 작성댓글 조회 구현 (0) | 2021.03.02 |
JAVA / SPRING 프로젝트 삼삼하개(2) LOCAL DATA API를 이용하여 판매허가번호 인증 구현 (0) | 2021.02.27 |