์ธ์ฆ ๋ฒํธ_์ ํจ ์๊ฐ(Session ์ฌ์ฉ)
<aside> ๐ก SMTP ์ฌ์ฉํ์ฌ ๋ฉ์ผ ( ์ธ์ฆ ๋ฒํธ : ๋๋ค ๋์ ) ์ ์ ์กํ ๋, ์ ํจ ์๊ฐ 3๋ถ์ session ์ ์ฌ์ฉํ์ฌ ์ ์ฉ ์ํค๋ ๊ณผ์ ์ ๋ํ ์ค๋ช ์ ๋๋ค.
</aside>
์ฝ๋
HTML
<meta name="_csrf_header" th:content="${_csrf.headerName}">
<meta name="_csrf" th:content="${_csrf.token}">
<div class="pop_wrap login user_find" data-layer-wrap="user_find" style="display: block;">
<div class="pop_top">
<!-- S : ์ฑํ : ํ์
์ฐฝ ๋ซ๊ธฐ ๋ฒํผ-->
<button class="pop_close hide_pop" data-layer-id="user_find" >
<img src="/pon/common/image/chat_close.svg" alt="">
</button>
<!-- E : ์ฑํ : ํ์
์ฐฝ ๋ซ๊ธฐ ๋ฒํผ-->
</div>
<div class="pop_content">
<h2 class="pop_title">์์ด๋ · ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ</h2>
<div class="login_wrap">
<div class="tab_menu">
<div class="tab_menu_btn">
<a href="javascript:void(0);" data-tab="tab1" class="active">์์ด๋ ์ฐพ๊ธฐ</a>
<a href="javascript:void(0);" data-tab="tab2">๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ</a>
</div>
<form th:action = "@{/findUsername}" method = "post" onsubmit="return findUsername()">
<div class="tab_cont current" data-tab-wrap="tab1">
<div class="input_wrap">
<input id="username" name="username" class="name_input" type="text" placeholder="์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์.">
<input id="phone" name="phone" type="number" placeholder="ํด๋ํฐ ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.">
</div>
<!-- S : ์ฑํ: ์์ด๋ ์ฐพ๊ธฐ ๋ฒํผ-->
<button type="button" class="btn btn_login_default login_btn" onclick="findUsername()">์์ด๋ ์ฐพ๊ธฐ</button>
<!-- E : ์ฑํ: ์์ด๋ ์ฐพ๊ธฐ ๋ฒํผ-->
<!-- ๊ธฐ์กด์ฝ๋ <button id="findId_find_btn" class="find_btn">์์ด๋ ์ฐพ๊ธฐ</button>-->
</div>
</form>
<div class="tab_cont" data-tab-wrap="tab2">
<div class="input_wrap">
<input id="findPw_name" class="name_input" type="text" placeholder="์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์.">
<input id="findPw_email" class="name_input" type="text" placeholder="์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.">
<div class="group">
<input id="findPw_auth_number" class="cert_input" type="number" placeholder="์ธ์ฆ ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.">
<button id="findPw_send_auth_number" class="cert_btn" onclick="**findUseremail**()">์ธ์ฆ๋ฒํธ ๋ฐ์ก</button>
<div id="timerDisplay" class="timer_display"></div>
</div>
</div>
<!-- S : ์ฑํ : ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ๋ฒํผ-->
<div class="login_btn_wrap">
<button type="button" class="btn btn_login_default login_btn" onclick="findUserpw()">๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ</button>
</div>
<!-- E : ์ฑํ : ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ๋ฒํผ-->
<!--๊ธฐ์กด์ฝ๋ <button id="findPw_find_btn" class="find_btn">๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ</button>-->
</div>
</div>
</div>
</div>
</div>
- JavaScipt
/* S: ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ - ์ด๋ฉ์ผ ์ฐพ๊ธฐ(์ด๋ฉ์ผ ๋ฐ์ก, ํ์ด๋จธ) */
function **findUseremail**(){
//์ฌ์ฉ์ ์
๋ ฅ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
var findpwname = $("#findPw_name").val();
var findpwemail = $("#findPw_email").val();
// ์๋ฒ๋ก ์ ์กํ ๋ฐ์ดํฐ ๊ตฌ์ฑ
data = new FormData();
data.append( "userNm", findpwname );
data.append( "userId", findpwemail );
var header = $("meta[name='_csrf_header']").attr('content');
var token = $("meta[name='_csrf']").attr('content');
// Ajax ๋ฅผ ์ฌ์ฉํ ์๋ฒ๋ก์ ์์ฒญ
$.ajax({
url: "/findUseremail",
type: "POST",
data: data,
cache: false,
contentType: false,
processData: false,
// contentType: "application/json; charset=utf-8",
beforeSend: function(xhr){
xhr.setRequestHeader(header, token);
},
success: function (result) {
// ํต์ ์ดํ ๋ก์ง
**if ( result.flag == "E" ) {**
**alert( result.msg );**
**} else if ( result.flag == "S" ) {**
// ์กด์ฌํ๋ ๊ณ์ ์ ๋ณด์ผ ๊ฒฝ์ฐ ์ธ์ฆ๋ฒํธ ๋ฐ์ก๋์๋ค๊ณ ์๋ฆผ
**alert(result.msg);**
// TODO : 3๋ถ ํ์ด๋จธ ํด์ผํจ
**startTimer**(**180**);
}
},
error: function (){
alert("code:"+request.status+"\\n"+"message:"+request.responseText+"\\n"+"error:"+error)
}
})
}
// ํ์ด๋จธ(3๋ถ)
function **startTimer**(**duration**) {
var timer = duration, minutes, seconds;
var intervalId = setInterval(function () {
minutes = parseInt(timer / 60, 10);
seconds = parseInt(timer % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
// 'timerDisplay'๋ผ๋ ID๋ฅผ ๊ฐ์ง HTML ์์์ ํ์ด๋จธ ํ์
$("#timerDisplay").text("์ฌ๋ฐ์ก (" + minutes + ":" + seconds + ")");
if (--timer < 0) {
clearInterval(intervalId);
// ํ์ด๋จธ๊ฐ 0์ ๋๋ฌํ๋ฉด ๋ฒํผ ํ
์คํธ๋ฅผ ์ด๊ธฐ ์ํ๋ก ๋ณ๊ฒฝ
$("#findPw_send_auth_number").text("์ธ์ฆ๋ฒํธ ๋ฐ์ก");
// ์ ํ์ ์ผ๋ก ํ์ด๋จธ๊ฐ 0์ ๋๋ฌํ์ ๋ ์ถ๊ฐ ์์
์ํ ๊ฐ๋ฅ
}
}, 1000);
}
/* E: ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ - ์ด๋ฉ์ผ ์ฐพ๊ธฐ(์ด๋ฉ์ผ ๋ฐ์ก, ํ์ด๋จธ) */
- Controller (1. ์ด๋ฉ์ผ ์ ์ก ์(์ธ์ฆ ๋ฒํธ) , 2. ์ธ์ฆ ๋ฒํธ ๊ฒ์ฆ)
/* S : ์ด๋ฉ์ผ ํ์ธ ๋ฐ ์ธ์ฆ๋ฒํธ ์ ์ก */
@ResponseBody
**@PostMapping("/findUseremail")**
public Map<String, Object> findUseremail( @ModelAttribute LoginDto loginDto) {
//๋ฉ์๋๊ฐ ์คํ๋๊ณ ๋์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ๋ถ๋ถ
Map<String, Object> result = new HashMap<String, Object>();
// ์ฌ๊ธฐ์์ ์ค์ ๋ก์ง์ ๊ตฌํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
// 1. ์ด๋ฆ/ ์ด๋ฉ์ผ / (๊ด๋ฆฌ์์ฌ๋ถ) ๋ก ๊ณ์ ์ ์ฐพ์
// ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ๊ธฐ๋ฅ์์ ์ค์ ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ ๋ถ๋ถ
LoginDto targetDto = loginService.findByUserNmAndUserIdAndMngrYn(loginDto);
if ( targetDto != null ) {
// 1-1. ํด๋น ์
๋ ฅ๊ฐ์ผ๋ก ์ฐพ์ ๊ณ์ ์ด ์์ ๋
result.put("flag", "S");
result.put("msg", "์ธ์ฆ๋ฒํธ๊ฐ ๋ฐ์ก๋์์ต๋๋ค. ");
//์ด๋ฉ์ผ ์ ์ก
// sendEmail(targetDto.getUserId(),generateRandomAuthNumber());
try{
sendEmail(targetDto.getUserId(),generateRandomAuthNumber(), session);
}catch(MessagingException e){
e.printStackTrace();
result.put("flag", "E");
result.put("msg","์ด๋ฉ์ผ ์ ์ก ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
return result;
}
} else if ( targetDto == null ) {
// 1-2. ํด๋น ์
๋ ฅ๊ฐ์ผ๋ก ์ฐพ์ ๊ณ์ ์ด ์์ ๋
result.put("flag", "E");
result.put("msg", "์
๋ ฅํ์ ์ ๋ณด์ ์ผ์นํ๋ ๊ณ์ ์ด ์กด์ฌํ์ง ์์ต๋๋ค. ๋ค์ ์๋ํด์ฃผ์ธ์. ");
}
return result;
}
**// ์ด๋ฉ์ผ ์ ์ก ๋ฉ์๋**
private void **sendEmail**(String to, String authNumber , **HttpSession session**)throws MessagingException{
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false, "UTF-8");
helper.setTo(to);
helper.setSubject("์ด๋ฉ์ผ ์ธ์ฆ๋ฒํธ");
helper.setText("์ธ์ฆ๋ฒํธ: " + authNumber, true);
javaMailSender.send(mimeMessage);
// ์ธ์
์ ์ธ์ฆ๋ฒํธ ์ ์ฅ
session.setAttribute("authCode", authNumber);
// TODO : ์์ ์๊ฐ ์ฒดํฌ
// ์ธ์
์ ์์์๊ฐ ์ ์ฅ
**session**.**setAttribute**("authStartTime", System.currentTimeMillis());
}
// ๋๋คํ ์ธ์ฆ๋ฒํธ ์์ฑ ๋ฉ์๋
private String generateRandomAuthNumber(){
// TODO ์ฌ๊ธฐ์ ๋๋ค ์ธ์ฆ๋ฒํธ ์์ฑ ๋ก์ง ์ถ๊ฐ (์กฐ๊ฑด : ๋๋คํ 6์๋ฆฌ ์ซ์)
// return "123456";
// ๋๋ค ์ธ์ฆ๋ฒํธ ์์ฑ (6์๋ฆฌ ์ซ์)
Random random = new Random();
int min = 100000;
int max = 999999;
int randomAuthNumber = random.nextInt((max - min) + 1) + min;
return String.valueOf(randomAuthNumber);
}
/* E : ์ด๋ฉ์ผ ํ์ธ ๋ฐ ์ธ์ฆ๋ฒํธ ์ ์ก */
- ์ด๋ฉ์ผ (์ธ์ฆ๋ฒํธ) ๋ฐ์ก ๋ฒํผ ํด๋ฆญ ์ ์๊ฐ์ ์ธ์ (Session) ์ ์ ์ฅํ๋ค.
/* S: ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ - ์ธ์ฆ๋ฒํธ ๊ฒ์ฆ */
@ResponseBody
**@PostMapping("/findUserpw")**
public Map<String,Object> findUserpw(@RequestParam String authNumber, **HttpSession session**){
Map<String, Object> result = new HashMap<>();
// ์ธ์
์์ ์ ์ฅ๋ [์ธ์ฆ๋ฒํธ] ์ [์์ ์๊ฐ] ๊ฐ์ ธ์ค๊ธฐ
String storedAuthCode = (String) session.getAttribute("authCode");
**Long startTime = (Long) session.getAttribute("authStartTime");**
if (storedAuthCode != null && storedAuthCode.equals(authNumber) && **startTime != null**) {
// ์ธ์ฆ๋ฒํธ ์ผ์น
result.put("flag", "S");
result.put("msg", "์ธ์ฆ์ ์ฑ๊ณตํ์ต๋๋ค.");
**// ๊ฒ์ฆ ์๊ฐ ์ฒดํฌ**
// TODO : ์์ ์๊ฐ , ๊ฒ์ฆ์๊ฐ ๋น๊ตํ์ฌ 3๋ถ ์ด๋ด์ธ์ง ํ์ธ
**long currentTime = System.currentTimeMillis();
long timeDifference = currentTime - startTime;
if (timeDifference <= 3 * 60 * 1000) {** // 3๋ถ (3 * 60 * 1000 ๋ฐ๋ฆฌ์ด)
// 3๋ถ ์ด๋ด
**result.put("flag", "S");
result.put("msg", "์ธ์ฆ์ ์ฑ๊ณตํ์ต๋๋ค.");**
// ์ธ์ฆ ์ฑ๊ณต ํ ํ์ํ ์์
์ํ
**} else {**
// 3๋ถ ๋์ด๊ฐ๋ฉด..
// ์๊ฐ์ด๊ณผ ๋ฉ์์ง..
**result.put("flag", "E");
result.put("msg", "์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค.");**
**}**
} else {
// ์ธ์ฆ๋ฒํธ ๋ถ์ผ์น
result.put("flag", "E");
result.put("msg", "์ธ์ฆ์ ์คํจํ์ต๋๋ค. ๋ค์ ์๋ํด์ฃผ์ธ์.");
}
return result;
}
/* E: ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ - ์ธ์ฆ๋ฒํธ ๊ฒ์ฆ */
๊ฐ Level ์ญํ
[์ธ์ฆ๋ฒํธ ๋ฐ์ก] ๋ฒํผ ํด๋ฆญ ์
- html ์ญํ : 03:00 (3๋ถ) ์ด ํ๋ฅด๊ณ ์์์ ํ์ถํด์ผ ํ๋ค.
- JavaScript ์ญํ : html ์ ์ค์๊ฐ์ผ๋ก ์๊ฐ์ด ํ๋ฅด๊ฒ ๋์ ๊ตฌํ
- Controller ์ญํ :
- 1-1: [์ธ์ฆ๋ฒํธ ๋ฐ์ก] ๋ฒํผ ํด๋ฆญ ์ → ํธ์ถ๋๋ ๋ฉ์๋์ ์์ ์๊ฐ์ ์ธ์ ์ ์ ์ฅ ,
- 1-2: ์ธ์ฆ๋ฒํธ ์ ๋ ฅ ํ [ํ์ธ] ๋ฒํผ ํด๋ฆญ ์ → ํด๋น ๋ฉ์๋ ํธ์ถ ํ์ฌ ์ธ์ฆ๋ฒํธ ๋ฐ์ก ํ ๋ ์ธ์ ์ ์ ์ฅํด๋ ์๊ฐ๊ณผ ํ์ฌ ์๊ฐ์ ๋น๊ตํ์ฌ 3๋ถ ์ด๋ด์ธ์ง(ํ์ฌ ์๊ฐ -๋ฐ์ก ์๊ฐ) ํ์ธ
- 1-3: ํด๋น ๊ฒฐ๊ณผ result ์ put ํ์ฌ ๊ฒฐ๊ณผ_return ์ํด.
'Spring๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Bean ์ ๋ฆฌ (1) | 2022.10.23 |
---|---|
JDBC,SQLMAPPER ์ ๋ฆฌ (0) | 2022.10.22 |
spring MVC(๋ชจ๋ธ2, DispatcherServlet) ์ ๋ฆฌ (3) | 2022.10.20 |
Spring(์คํ๋ง) : API (2) | 2022.09.24 |
Spring ์ค์น (1) | 2022.04.01 |