목표: 모델링한 DTO, DAO를 이용하여 실제 회원가입을 수행하고, 이메일 전송 기능 구현
STEP 1 SHA256.java, Gmail.java 생성.
SHA256.java 클래스 : 회원가입 및 이메일 인증에 사용할 해시 데이터를 생성하는 Class
Gmail.java 클래쓰 : SMTP를 이용해 이메일 인증 메세지 전송 관련 Class
STEP 2 라이브러리 다운
SMTP 메일 전송을 위해 필요한 외부 라이브러리.
Mail 라이브러리
Activation Class
STEP 3
SHA256.java
STEP 4
Gmail.java
STEP 5
구글 계정 보안 수준 낮은 앱 설정.
STEP 6
userRegisterAction.jsp: 회원가입을 처리한다. 사용자 정보를 DB에 등록하고 자동으로 사용자의 이메일로 이메일을 전송하고 인증을 기다린다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="user.UserDTO"%>
<%@ page import="user.UserDAO"%>
<%@ page import="util.SHA256"%>
<%@ page import="java.io.PrintWriter"%>
<%
request.setCharacterEncoding("UTF-8");
String userID = null;
String userPassword = null;
String userEmail = null;
if (request.getParameter("userID") != null) {
userID = request.getParameter("userID");
}
if (request.getParameter("userPassword") != null) {
userPassword = request.getParameter("userPassword");
}
if (request.getParameter("userEmail") != null) {
userEmail = request.getParameter("userEmail");
}
if (userID == null || userPassword == null || userEmail == null) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('입력이 안 된 사항이 있습니다.');");
script.println("history.back();");
script.println("</script>");
script.close();
return;
}
UserDAO userDAO = new UserDAO();
int result = userDAO.join(new UserDTO(userID, userPassword, userEmail, SHA256.getSHA256(userEmail), false));
if (result == -1) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('이미 존재하는 아이디입니다.');");
script.println("history.back();");
script.println("</script>");
script.close();
return;
} else {
session.setAttribute("userID", userID);
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("location.href = 'emailSendAction.jsp'");
script.println("</script>");
script.close();
return;
}
%>
STEP 7
emailSendAction.jsp: 이메일 인증 메시지를 이메일을 통해 전송.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="javax.mail.Transport" %>
<%@ page import="javax.mail.Message" %>
<%@ page import="javax.mail.Address" %>
<%@ page import="javax.mail.internet.InternetAddress" %>
<%@ page import="javax.mail.internet.MimeMessage" %>
<%@ page import="javax.mail.Session" %>
<%@ page import="javax.mail.Authenticator" %>
<%@ page import="java.util.Properties" %>
<%@ page import="user.UserDAO"%>
<%@ page import="util.SHA256"%>
<%@ page import="util.Gmail"%>
<%@ page import="java.io.PrintWriter"%>
<%
UserDAO userDAO = new UserDAO();
String userID = null;
if(session.getAttribute("userID") != null) {
userID = (String) session.getAttribute("userID");
}
if(userID == null) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('로그인을 해주세요.');");
script.println("location.href = 'userLogin.jsp'");
script.println("</script>");
script.close();
return;
}
boolean emailChecked = userDAO.getUserEmailChecked(userID);
if(emailChecked == true) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('이미 인증 된 회원입니다.');");
script.println("location.href = 'index.jsp'");
script.println("</script>");
script.close();
return;
}
// 사용자에게 보낼 메시지를 기입합니다.
String host = "http://localhost:8080/Lecture_Evaluation/";
String from = "이메일 아이디";
String to = userDAO.getUserEmail(userID);
String subject = "강의평가를 위한 이메일 확인 메일입니다.";
String content = "다음 링크에 접속하여 이메일 확인을 진행하세요." +
"<a href='" + host + "emailCheckAction.jsp?code=" + new SHA256().getSHA256(to) + "'>이메일 인증하기</a>";
// SMTP에 접속하기 위한 정보를 기입합니다.
Properties p = new Properties();
p.put("mail.smtp.user", from);
p.put("mail.smtp.host", "smtp.googlemail.com");
p.put("mail.smtp.port", "456");
p.put("mail.smtp.starttls.enable", "true");
p.put("mail.smtp.auth", "true");
p.put("mail.smtp.debug", "true");
p.put("mail.smtp.socketFactory.port", "465");
p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
p.put("mail.smtp.socketFactory.fallback", "false");
try {
Authenticator auth = new Gmail();
Session ses = Session.getInstance(p, auth);
ses.setDebug(true);
MimeMessage msg = new MimeMessage(ses);
msg.setSubject(subject);
Address fromAddr = new InternetAddress(from);
msg.setFrom(fromAddr);
Address toAddr = new InternetAddress(to);
msg.addRecipient(Message.RecipientType.TO, toAddr);
msg.setContent(content, "text/html;charset=UTF8");
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('오류가 발생했습니다..');");
script.println("history.back();");
script.println("</script>");
script.close();
return;
}
%>
<!doctype html>
<html>
<head>
<title>강의평가 웹 사이트</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- 부트스트랩 CSS 추가하기 -->
<link rel="stylesheet" href="./css/bootstrap.min.css">
<!-- 커스텀 CSS 추가하기 -->
<link rel="stylesheet" href="./css/custom.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.jsp">메인</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
회원 관리
</a>
<div class="dropdown-menu" aria-labelledby="dropdown">
<a class="dropdown-item" href="userLogin.jsp">로그인</a>
</div>
</li>
</ul>
<form action="./index.jsp" method="get" class="form-inline my-2 my-lg-0">
<input type="text" name="search" class="form-control mr-sm-2" placeholder="내용을 입력하세요.">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
</form>
</div>
</nav>
<div class="container">
<div class="alert alert-success mt-4" role="alert">
이메일 주소 인증 메일이 전송되었습니다. 이메일에 들어가셔서 인증해주세요.
</div>
</div>
<footer class="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
Copyright ⓒ 2020 한승표 All Rights Reserved.
</footer>
<!-- 제이쿼리 자바스크립트 추가하기 -->
<script src="./js/jquery.min.js"></script>
<!-- Popper 자바스크립트 추가하기 -->
<script src="./js/popper.min.js"></script>
<!-- 부트스트랩 자바스크립트 추가하기 -->
<script src="./js/bootstrap.min.js"></script>
</body>
</html>
STEP 8
emailCheckAction.jsp: 사용자가 이메일 인증을 하게 되면 그에 대한 정보를 처리.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="user.UserDAO"%>
<%@ page import="util.SHA256"%>
<%@ page import="java.io.PrintWriter"%>
<%
request.setCharacterEncoding("UTF-8");
String code = null;
if(request.getParameter("code") != null) {
code = request.getParameter("code");
}
UserDAO userDAO = new UserDAO();
String userID = null;
if(session.getAttribute("userID") != null) {
userID = (String) session.getAttribute("userID");
}
if(userID == null) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('로그인을 해주세요.');");
script.println("location.href = 'userLogin.jsp'");
script.println("</script>");
script.close();
return;
}
String userEmail = userDAO.getUserEmail(userID);
boolean isRight = (new SHA256().getSHA256(userEmail).equals(code)) ? true : false;
if(isRight == true) {
userDAO.setUserEmailChecked(userID);
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('인증에 성공했습니다.');");
script.println("location.href = 'index.jsp'");
script.println("</script>");
script.close();
return;
} else {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('유효하지 않은 코드입니다.');");
script.println("location.href = 'index.jsp'");
script.println("</script>");
script.close();
return;
}
%>
*words
해시(hash)란 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(mapping)한 값이다.
문제 1 회원가입 버튼 누르면 주소오류
해결 .userRegisterAction를 userRegisterAction로 수정한 후 해결.
문제 2 데이터베이스 연동오류
해결
util DatabaseUtil.java 파일 DBURL 뒤에 아래 주소 추가 후 해결.(mysql 버전 업그레이드로 생긴 오류라고한다.)
?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Timezone문제라고 한다. 타임존은 동일한 로컬 시간을 따르는 지역을 의미하며, 주로 해당 국가에 의해 법적으로 지정된다. 보통 국가별로 각자의 고유한 타임존을 사용하고 있으며, 미국이나 캐나다처럼 면적이 넓은 나라인 경우 지역별로 각지 다른 타임존을 사용하기도 한다.
문제 3 JRE 자바 버전오류? no 그냥 코드 오타.
해결 JRE 다른 버전 설치, 이클립스에 적용 그래도 안되서 봤더니 그냥 코드오타가 있었다... 후..
그냥 넘어갈까 말까 너무 찝찝해서 결국 이틀만에 해결. 해결하고 보니 별거 아니지만 엄청난 삽질을 통해 용어도 익숙해지고 문제앞에 인내심도 생긴다. 이번 과정을 통해서 어디서 문제가 생겼는지 파악하는 눈치가 조금 생겼다. 어떤 코드까지 괜찮고 어디서부터 문제인지를 파악하면서 하니 막연하지 않았던거 같다. 절대 못넘을거 같은 벽을 넘으니 정말 뿌듯하다.
'JAVA > JSP' 카테고리의 다른 글
JSP로 강의평가 웹 사이트 - 평가 등록 및 신고 구현 (0) | 2020.05.09 |
---|---|
JSP로 강의평가 웹 사이트 - 로그인 및 로그아웃 구현하기 (0) | 2020.05.08 |
JSP 강의평가 웹사이트 - 회원 데이터 모델링 (0) | 2020.05.06 |
JSP 강의평가 웹사이트 - 데이터베이스 구축 (0) | 2020.05.03 |
JSP 강의평가 웹사이트 - 로그인 및 회원가입 화면 (0) | 2020.05.03 |