이름과 이메일을 입력받는 것은 frontend, 일치 시 id를 가져오는 것은 backend에서 작업한다.
우선, 아이디와 비밀번호 찾기를 위한 연습용 데이터 행을 추가하자. 이메일 주소는 반드시 확인 가능한, 실재하는 주소를 적어줘야 한다.
insert into member(id, passwd, mname, tel, email, zipcode, address1, address2, job, mlevel, mdate)
values('사용할 id', '12341234', 'ewok', '123-4567', '본인 이메일'
, '12345', '주소1', '주소2, 'A02', 'A1', sysdate );
-- 아이디/비번찾기
1) 이름과 이메일 일치하면
select id
from member
where mname=? and email=?
2) 임시 비밀번호를 발급해서 테이블 수정하기
update member
set passwd=?
where mname=? and email=?
MemberDAO.java
public boolean findID(MemberDTO dto) {
boolean flag = false;
try {
con = dbopen.getConection();
sql = new StringBuilder();
//이름과 이메일이 일치하는 id 가져오기
sql.append(" SELECT id ");
sql.append(" FROM member ");
sql.append(" WHERE mname=? AND email=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, dto.getMname());
pstmt.setString(2, dto.getEmail());
rs = pstmt.executeQuery();
if (rs.next()) { //이름과 이메일이 일치되었다면
String id = rs.getString("id"); //1)아이디
//[임시 비밀번호 발급]
//대문자, 소문자, 숫자를 이용해서 랜덤하게 10글자 만들기
String[] ch = {
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"0","1","2","3","4","5","6","7","8","9"
}; //ch[0]~ch[61] 인덱스
//ch배열에서 랜덤하게 10글자 뽑아서 가져오기
StringBuilder imsiPW = new StringBuilder(); //2)임시 비밀번호
for(int i=0; i<10; i++) {
int num=(int)(Math.random()*ch.length);
imsiPW.append(ch[num]);
}//for end
//임시 비밀번호로 테이블 수정하기
sql = new StringBuilder();
sql.append(" UPDATE member ");
sql.append(" SET passwd=? ");
sql.append(" WHERE mname=? AND email=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, imsiPW.toString()); //임시비밀번호
pstmt.setString(2, dto.getMname());
pstmt.setString(3, dto.getEmail());
int cnt = pstmt.executeUpdate();
if(cnt==1) {
//임시 비밀번호로 테이블 수정되었다면, 아이디와 비밀번호를 이메일 전송하기
String content = "* 임시 비밀번호로 로그인 한 후, 회원 정보 수정에서 비밀번호를 변경하시기 바랍니다.";
content += "<hr>";
content += "<table border='1'>";
content += "<tr>";
content += " <th>임시 비밀번호</th>";
content += "</tr>";
content += "<tr>";
content += " <td>"+ imsiPW.toString() +"</td>";
content += "</tr>";
content += "</table>";
String mailServer = "mw-002.cafe24.com"; //cafe24 메일서버
Properties props = new Properties();
props.put("mail.smtp.host", mailServer);
props.put("mail.smtp.auth", true);
Authenticator myAuth = new MyAuthenticator(); //다형성
Session sess = Session.getInstance(props, myAuth);
InternetAddress[] address = {new InternetAddress(dto.getEmail())};
Message msg = new MimeMessage(sess);
msg.setRecipients(Message.RecipientType.TO, address);
msg.setFrom(new InternetAddress("webmaster@itwill.co.kr"));
msg.setSubject("MyWeb 아이디/비번 입니다");
msg.setContent(content, "text/html; charset=UTF-8");
msg.setSentDate(new Date());
Transport.send(msg);
flag = true;
}//if end
} else {
flag = false;
}//if end
} catch (Exception e) {
System.out.println("아이디/비번 찾기 실패 : " + e);
} finally {
DBClose.close(con, pstmt, rs);
}//end
return flag;
}//findID() end
이메일도 backend에서 전송하기로 한다.
이제 아이디 찾기 페이지 작업을 하자
findID.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 findID.jsp-->
<h3>*아이디 찾기 *</h3>
<form method="post" action="findIDProc.jsp" onsubmit="return findIDCheck()"><!-- myscript.js -->
<table class="table">
<tr>
<td>이름 : <input type="text" name="mname" id="mname"></td>
</tr>
<tr>
<td>이메일 : <input type="text" name="email" id="email"></td>
</tr>
</table>
<button>다음</button>
</form>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp"%>
findIDProc.jsp
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 findIDProc.jsp-->
<h3>* 아이디 찾기 결과 *</h3>
<%
String mname = request.getParameter("mname").trim();
String email = request.getParameter("email").trim();
dto.setMname(mname);
dto.setEmail(email);
boolean flag = dao.findID(dto);
if(flag==false) {
out.println("<p>이름/이메일을 다시 한번 확인해주세요!!</p>");
out.println("<p><a href='jaascript:history.back()'>[다시시도]</a></p>");
} else {
String message = "";
message += "아이디/임시 비밀번호가 이메일로 전송되었습니다.\\n";
message += "임시 비밀번호는 로그인 후 회원정보수정에서 수정하시기 바랍니다";
out.println("<script>");
out.println(" alert('" +message + "');");
out.println(" location.href='loginForm.jsp'");
out.println("</script>");
}//if end
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp"%>
나는 아이디 찾기와 비밀번호 찾기 페이지를 분리하여 진행했다.
아이디 찾기
findID.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 findID.jsp-->
<h3>*아이디 찾기 *</h3>
<form action="findIDProc.jsp">
<table class="table">
<tr>
<td>이름 : <input type="text" name="mname" id="mname"></td>
</tr>
<tr>
<td>이메일 : <input type="text" name="email" id="email"></td>
</tr>
</table>
<button>다음</button>
</form>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp"%>
findIDProc.jsp
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 findIDProc.jsp-->
<%
String mname = request.getParameter("mname").trim();
String email = request.getParameter("email").trim();
//out.println(mname);
//out.println(email);
dto.setMname(mname);
dto.setEmail(email);
String id = dao.findID(dto);
if(id.length()<1) {
out.println("<p>회원정보가 없습니다</p>");
out.println("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
} else {
out.println("<p>아이디 : " + id + "</p>");
out.println("<br>");
out.println("<a href='findPasswd.jsp'>비밀번호 찾기</a>");
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp"%>
MemberDAO.java
public String findID(MemberDTO dto) {
String id = null;
try {
con = dbopen.getConection();
sql = new StringBuilder();
sql.append(" SELECT id ");
sql.append(" FROM member ");
sql.append(" WHERE mname=? AND email=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, dto.getMname());
pstmt.setString(2, dto.getEmail());
rs = pstmt.executeQuery();
if (rs.next()) {
id = rs.getString("id");
}//if end
} catch (Exception e) {
System.out.println("아이디 찾기 실패 : " + e);
} finally {
DBClose.close(con, pstmt, rs);
}//end
return id;
}//findID() end
비밀번호 찾기
findPasswd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 findPasswd.jsp-->
<h3>비밀번호 찾기</h3>
<p>비밀번호를 찾고자 하는 아이디를 입력해 주세요.</p>
<form action="findPasswdProc.jsp">
<input type="text" name="id" id="id">
<br><br>
<button>다음</button>
</form>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp"%>
findPasswdProc.jsp
<%@page import="java.util.Date"%>
<%@page import="javax.mail.Transport"%>
<%@page import="javax.mail.internet.MimeMessage"%>
<%@page import="javax.mail.Message"%>
<%@page import="javax.mail.internet.InternetAddress"%>
<%@page import="net.utility.Utility"%>
<%@page import="javax.mail.Session"%>
<%@page import="net.utility.MyAuthenticator"%>
<%@page import="javax.mail.Authenticator"%>
<%@page import="java.util.Properties"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 findPasswdProc.jsp-->
<h3>임시 비밀번호 발급</h3>
<p>아래 이메일로 임시 비밀번호를 전송합니다.</p>
<%
String id = request.getParameter("id");
dto.setId(id);
String email = dao.findEmail(id);
dto.setEmail(email);
//전송할 이메일 보여주기
if(email.length()<1) {
out.println("<p>회원정보가 없습니다</p>");
out.println("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
} else {
out.println("<p>이메일 : " + email + "</p>");
}
//임시 비밀번호 생성
String tmpPasswd = dao.tmpPasswd(dto);
//out.print(tmpPasswd);
//임시 비밀번호 메일로 전송
dao.sendTmpPw(tmpPasswd, dto);
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp"%>
MemberDAO.java
public String findEmail(String id) {
String email = null;
try {
con = dbopen.getConection();
sql = new StringBuilder();
sql.append(" SELECT email ");
sql.append(" FROM member ");
sql.append(" WHERE id=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if (rs.next()) {
email = rs.getString("email");
}//if end
} catch (Exception e) {
System.out.println("아이디 찾기 실패 : " + e);
} finally {
DBClose.close(con, pstmt, rs);
}//end
return email;
}//findEmail() end
public String tmpPasswd(MemberDTO dto) {
char[] upp = new char[26];
char[] low = new char[26];
int[] numInt = new int[10];
//대,소문자 배열에 넣기
char num = 65;
for (int i=0; i<26; i++) {
upp[i] = num;
low[i] = (char)(num+32);
num++;
}//for end
//숫자 배열에 넣기
for (int k=0; k<10; k++) {
numInt[k] = k;
}//for end
//임시 비밀번호에 사용되는 대문자, 소문자, 숫자 각 개수 설정
int a = (int)Math.floor(Math.random()*10); //대문자 개수
int b = (int)Math.floor(Math.random()*(10-a)); //소문자 개수
int c = 10 - a - b; //숫자 개수
//임시 비밀번호 저장. (대문자, 소문자, 숫자가 나오는 자릿수를 임의로 지정하기 위해 set 사용)
Set set = new HashSet();
StringBuilder pw = new StringBuilder();
//임시 비밀번호 생성
while (true) { //set은 중복을 허용하지 않기 때문에 중복값이 들어가면 10자리가 안나온다. 따라서 10자리 나올때까지 반복
if(set.size()==10) {
Iterator iter = set.iterator();
while (iter.hasNext()) { //다음 cursor가 있는지?
//cursor가 가리키는 요소 가져오기
Object obj = iter.next();
pw.append(obj);
}//while end
break;
} else {
set.clear();
//대문자
for (int i=0; i<a; i++) {
int idx = (int)Math.floor(Math.random()*26); //배열에서 랜덤하게 값을 가져오기 위해
set.add(upp[idx]);
}
//소문자
for (int j=0; j<b; j++) {
int idx = (int)Math.floor(Math.random()*26);
set.add(low[idx]);
}
//숫자
for (int k=0; k<c; k++) {
int idx = (int)Math.floor(Math.random()*10);
set.add(numInt[idx]);
}
}//if end
}//while end
//임시 비밀번호로 수정
try {
con = dbopen.getConection();
sql = new StringBuilder();
sql.append(" UPDATE member ");
sql.append(" SET passwd=? ");
sql.append(" WHERE id=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, pw.toString());
pstmt.setString(2, dto.getId());
pstmt.executeQuery();
} catch (Exception e) {
System.out.println("임시 비밀번호로 수정 실패 : " + e );
} finally {
DBClose.close(con, pstmt);
}//end
return pw.toString();
}//tmpPasswd() end
public void sendTmpPw(String tmpPasswd, MemberDTO dto) {
try {
String content = "* 임시 비밀번호로 로그인 한 후, 회원 정보 수정에서 비밀번호를 변경하시기 바랍니다.";
content += "<hr>";
content += "<table border='1'>";
content += "<tr>";
content += " <th>임시 비밀번호</th>";
content += "</tr>";
content += "<tr>";
content += " <td>"+ tmpPasswd +"</td>";
content += "</tr>";
content += "</table>";
String mailServer = "mw-002.cafe24.com"; //cafe24 메일서버
Properties props = new Properties();
props.put("mail.smtp.host", mailServer);
props.put("mail.smtp.auth", true);
Authenticator myAuth = new MyAuthenticator(); //다형성
Session sess = Session.getInstance(props, myAuth);
InternetAddress[] address = {new InternetAddress(dto.getEmail())};
Message msg = new MimeMessage(sess);
msg.setRecipients(Message.RecipientType.TO, address);
msg.setFrom(new InternetAddress("webmaster@itwill.co.kr"));
msg.setSubject("MyWeb 임시 비밀번호 입니다");
msg.setContent(content, "text/html; charset=UTF-8");
msg.setSentDate(new Date());
Transport.send(msg);
} catch (Exception e) {
System.out.println("메일 전송 실패 : " + e);
}//end
}//sendTmpPw() end
비밀번호 찾기를 하면 아래와 같이 이메일로 임시 비밀번호가 왔다.
기존의 비밀번호로 로그인을 시도한 결과이다.
임시 비밀번호로 로그인을 해보자
'웹개발 교육 > jsp' 카테고리의 다른 글
[60일] jsp (35) - myweb 프로젝트(첨부 게시판) (0) | 2022.10.21 |
---|---|
[59일] jsp (34) - myweb 프로젝트(첨부 게시판 기초) (0) | 2022.10.20 |
[58일] jsp (32) - myweb 프로젝트(메일 보내기) (0) | 2022.10.19 |
[57일] jsp (31) - myweb 프로젝트(회원가입 유효성 검사) (0) | 2022.10.18 |
[57일] jsp (30) - myweb 프로젝트(id 중복 확인) (0) | 2022.10.18 |