지난 포스팅에선 이메일 정규식 검증을 진행했습니다.
이번엔 이어서 이메일 중복확인 절차를 진행해보도록 하겠습니다.
이메일 중복확인 시퀀스 다이어그램
이메일 중복확인을 호출하는 emailAuthentication() 부터 다시 살펴보겠습니다.
<script type="text/javascript">
...
function emailAuthentication(){
if(!emailValCheck()){
return false;
}
var url = "confirmEmail.four?email=" + document.signUpForm.email.value;
var condition = "toolbar=no, location=no,menubar=no,scrollbars=no,resizable=no,width=300,height=200"
open(url, "confirm", condition);
}
...
</script>
해당 함수에서 이메일 중복확인을 하려면?
조건 : 정규식을 만족
실행 : email을 get 방식으로 request에 실어서 confirmEmail.four로 전송
주소 마지막이 .four인 이유
저희 조가 4조여서 서블렛 태그를 @webServlet("*.four")로 설정해서 그렇습니다 ^^;;
Ajax를 쓰면 새창으로 띄울필요가 없습니다.
Ajax나 iframe을 쓰지 않으면, 현재 페이지를 유지하며 request를 보낼 방법이 새창 띄우기밖에 없습니다.
프로젝트 기간에 여유가 있었다면 시도를 해보았을 텐데, Ajax를 사용한건 프로젝트 후반부라 고칠 시간이 없었네요 ㅠ
iframe이라도 시도해볼걸 하고 좀 아쉬운 부분이긴 합니다.
이 부분을 처리하는 컨트롤러를 보겠습니다.
//...
String uri = request.getRequestURI();
String conPath = request.getContextPath();
String com = uri.substring(conPath.length());
switch (com) {
//...
case "/confirmEmail.four":
command = new DupleEmailCheckCommand();
command.execute(request, response);
viewPage = "confirmEmail.jsp";
break;
//...
}
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
dispatcher.forward(request, response);
//...
}
컨트롤러를 보면 방금 띄운 새창으로 DupleEmailCheckCommand가 실행되겠죠? 계속해서 보겠습니다.
public class DupleEmailCheckCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
//중복체크
String email = request.getParameter("email");
Dao_Login dao = new Dao_Login();
String result = dao.emailDupleCheck(email);
request.setAttribute("emailDupleCheckResult", result);
request.setAttribute("email", email);
}
}
DupleEmailCheckCommand
- String email : 새창을 띄우며 보낸 email을 저장
- Dao_Login dao : Dao_Login 클래스의 인스턴스 생성
- Strung result : Dao_Login의 emailDupleCheck()메소드에 email을 매개변수로 전달한 결과를 저장
- request 값 전송
- request.setAttribute("emailDupleCheckResult", result);
- request.setAttribute("email", email);
- 중복확인의 결과와 이메일을 request에 적재
Dao_Login의 emailDupleCheck()
public class Dao_Login {
DataSource dataSource;
public Dao_Login() {
System.out.println("Connectiong database...");
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/team4");
System.out.println("Database connection success");
} catch (NamingException e) {
System.out.println("Database connection failed");
e.printStackTrace();
}
}
//...
public String emailDupleCheck(String inputEmail) {
String result = "unuseable";
String query = "SELECT email FROM user WHERE email = ?";
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
psmt = conn.prepareStatement(query);
psmt.setString(1, inputEmail);
rs = psmt.executeQuery();
if (!rs.next()) {
result = "useable";
System.out.println("this email possible to use.");
} else {
result = "unuseable";
System.out.println("this email is already in use.");
}
} catch (Exception e) {
System.out.println("email duplecation check fail");
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
System.out.println("< rs, psmt, conn close success>");
} catch (Exception e) {
System.out.println("< rs, psmt, conn close Fail>");
}
}
return result;
}
//...
}
DataSource?
- 목적 : 직접 MySQL id와 pw, 접속주소를 class에 직접 적어 노출시키지 않기 위해 사용
- 사용방법 : 톰캣 서버의 context.xml에 있는 Resource에 MySQL Connect에 필요한 정보를 기입후 인스턴스로 호출
Prepare Statement
- SQL injection을 방지하기 위해 Prepare Statement로 쿼리를 실행시켰습니다.
실행 결과
- 해당 이메일이 db에 존재한다면 "unuseable" 반환
- 해당 이메일이 db에 존재하지 않는다면 "useable"를 반환
이후, Controller는 RequestDispatcher의 forward메서드를 사용해
viewPage변수에 저장한 confirmEmail.jsp에 해당 request를 보내게 됩니다.
confirmEmail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Email 확인</title>
</head>
<%! String email = ""; %>
<% email = request.getParameter("email"); %>
<script type="text/javascript">
function cancel() {
self.close();
}
function requestAuthEamil(){
var url = "requestAuthEmail.four?email=" + "<%=email%>";
open(url, "authEmailSend",
"toolbar=no, location=no,menubar=no,scrollbars=no,resizable=no,width=300,height=200");
}
</script>
<body>
<c:set var="emailDupleCheckResult" value="${emailDupleCheckResult }" />
<c:choose>
<c:when test="${emailDupleCheckResult == 'useable' }">
<a>인증메일을 전송중입니다. 팝업창을 허용해주세요.</a>
<script type="text/javascript">requestAuthEamil();</script>
</c:when>
<c:otherwise>
<h4> ${email }은 사용 불가능한 email입니다.</h4>
</c:otherwise>
</c:choose>
<br><br>
<button type="button" onclick="cancel()" class="btnCancel">확인</button>
</body>
</html>
허허...불과 한주전 코드인데도 지금보니 조금 창피하네요...;;
<%! String email = ""; %> 대신에
<% email = request.getParameter("email"); %> 로 더 깔끔하게 작성할 수 있었을텐데 ^^;;
여튼...각설하고! 다른 부분은 다음 포스팅인 이메일 인증(드디어!)에서 설명하기로 하고,
emailDupleCheckResult에 unuseable 또는 useable값을 실어서 보냈었죠?
<c:set var="emailDupleCheckResult" value="${emailDupleCheckResult }" />
<c:choose>
<c:when test="${emailDupleCheckResult == 'useable' }">
<a>인증메일을 전송중입니다. 팝업창을 허용해주세요.</a>
<script type="text/javascript">requestAuthEamil();</script>
</c:when>
<c:otherwise>
<h4> ${email }은 사용 불가능한 email입니다.</h4>
</c:otherwise>
</c:choose>
<br><br>
<button type="button" onclick="cancel()" class="btnCancel">확인</button>
JSP 대신 JSTL로 분기
JSTL 태그라이브러리를 사용해 놀랍도록 깔끔하게(?) 처리
역할
- 이메일이 중복되지 않았다면 requestAuthEamil()를 실행해 새창으로 인증이메일을 전송
- 이메일이 중복되었다면 '확인'버튼과 결과를 알려주는 글귀만 출력
이로써 이메일 중복체크까지 완료했구요, 다음은 마지막으로 이메일 인증과정을 포스팅하도록 하겠습니다.
JSP 회원가입시 이메일 인증 절차 구현- (1) 시작하며
JSP 회원가입시 이메일 인증 절차 - (2) 이메일 정규식 검증
JSP 회원가입시 이메일 인증 절차 - (3) 이메일 중복 확인
JSP 회원가입시 이메일 인증 절차 - (4) 인증 이메일 전송
'IDE & Framework > 분류중' 카테고리의 다른 글
JSP 페이징된 게시판 만들기 (0) | 2021.05.30 |
---|---|
JSP 회원가입시 이메일 인증 절차 - (4/4) 인증 이메일 전송 및 인증 (0) | 2021.05.30 |
JSP 회원가입시 이메일 인증 절차 - (2/4) 이메일 정규식 검증 (0) | 2021.05.29 |
JSP 회원가입시 이메일 인증 절차 구현- (1/4) 시작하며 (0) | 2021.05.29 |
유용하게 썻던 JSTL-Core Tag정리 (0) | 2021.05.29 |