본문 바로가기
Project Development/Java_programming

비밀번호 찾기 - 메일 인증

by SeleniumBindingProtein 2021. 12. 15.
728x90
반응형

 

package miniProjectPrivateBMK_memberFrm;
/*
 * id varchar2(10) NOT NULL 
	, pw varchar2(15) NOT NULL
	, name varchar2(30) NOT NULL
	, age number(3) NOT NULL
	, gender varchar2(3) NOT NULL 
	, phone varchar2(20) NOT NULL
	, email varchar2(100) NOT NULL
	, address varchar2(1000) NOT NULL 
	, regidate DATE DEFAULT sysdate NOT NULL
	, PRIMARY KEY(id)
 */
import java.sql.Date;

public class MemberVO {

	private String id;
	private String pw;
	private String name;
	private int age;
	private String gender;
	private String phone;
	private String email;
	private String address;
	private Date regidate;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Date getRegidate() {
		return regidate;
	}
	public void setRegidate(Date regidate) {
		this.regidate = regidate;
	}	
}

 

 

 

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>로그인</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500&display=swap" rel="stylesheet">
	<link rel="stylesheet" href="../css/login.css">
</head>
	<body>
		<div class="wrap">
			<form name="frmLogin" method="post" class="frmLogin"
             		enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
              	<div class="loginFrm">
              		<div class="frmList">
              			<h2>로그인</h2>
						<div class="login_id">
							<label><span>아이디 : </span><input class="text" type="text" name="user_id" placeholder="아이디"></label>
						</div> 
		
						<div class="login_pw" >		
							<label><span>비밀번호 : </span><input class="password" type="password" name="user_pw" placeholder="비밀번호"></label>
						</div>
		
						<div class="login_btn">
							<input type="checkbox" name="user_save"> 아이디/패스워드 저장
  							<input class="btnSubmit" type="submit" value="로그인">
						</div>
						
						<div class="sign_up">	
							<a class="join" href="memberForm.html">회원가입</a>
 							<a class="searchIdAndPwd" href="searchId.html">아이디찾기</a>
 							<a class="searchIdAndPwd" href="searchPwd.html">패스워드찾기</a>
						</div>		
					</div>
				</div>
			</form>
		</div>
	</body>
</html>

 

 

 

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>패스워드찾기</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500&display=swap" rel="stylesheet">
	<script type="text/javascript">
	function pwd_search() { 
	 	var frm = document.searchPwdScreen;

	 	if (frm.id.value.length == 0){
	 		alert("아이디를 입력해주세요");
	 	}
	 	else if (frm.name.value.length < 1) {
			alert("이름을 입력해주세요");
		 }
	 	else if (frm.email.value.length == 0) {
			 alert("이메일을 정확하게 입력해주세요");
		 }
	 	else{
	 		frm.method = "post";
	 		frm.action = "searchPwdE-mail";
	 		frm.submit();  
	 	}
	 }
	</script>
</head>
	<body>
		<div class="wrap">
			<form name="searchPwdScreen" method="post">
				<div class="screenPwd"><h1>패스워드찾기</h1></div>
				<section class="frmSearch">
					<div class="idSearch">
						<label>아이디</label><input type="text" class="memberId" name="id" placeholder="아이디를 입력하세요.">
					</div>
					<br>
					
					<div class="nameSearch">
						<label>이름</label><input type="text" class="memberName" name="name" placeholder="이름을 입력하세요.">
					</div>
					<br>
						
					<div class="phoneSearch">
						<label>이메일</label><input type="text" class="memberEmail" name="email" placeholder="이메일을 입력하세요.">
					</div>
					<br>
				</section>
				<div class="btnSearch">
					<input type="button" name="enter" value="찾기" onClick="pwd_search()">
					<input type="reset" name="cancel" value="취소" onClick="history.back()">
					<input type="hidden" name="command" value="searchPwd">
				</div>
					
			</form>
		</div>
	</body>
</html>

 

 

 

package miniProjectPrivateBMK_memberFrm;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/miniProject/html/searchPwdE-mail")		//서블릿 매핑 이름 
public class MemberServletMemberSearchPwd extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		System.out.println("MemberServletMemberSearchPwd");
		//전송된 리퀘스트를 가져옴
		String id = request.getParameter("id");
		String name = request.getParameter("name");	
		String email = request.getParameter("email");
		
		MemberVO memberVO = new MemberVO();
		// memberVO를 만들어서 리퀘스트에서 불러온 값을 저장 
		memberVO.setId(id);
		memberVO.setName(name);
		memberVO.setEmail(email);

		MemberDAO dao = new MemberDAO();
		String flag = dao.searchPwd(memberVO);
		// 조회한 값이 맞다면, emailCode로 이동
		if(flag != null) {
			request.setAttribute("id",id);
			request.setAttribute("name",name);
			request.setAttribute("email",email);
			RequestDispatcher d = request.getRequestDispatcher("emailCode");
			d.forward(request, response);
		}
		else {
			RequestDispatcher d = request.getRequestDispatcher("searchPwd.html");
			d.forward(request, response);
		}
	}
}

 

Mail.java

package miniProjectPrivateBMK_memberFrm;

import java.io.IOException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/miniProject/html/emailCode")
public class Mail extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//전송된 리퀘스트를 가져옴
		String id = request.getParameter("id");
    	String name = request.getParameter("name");	
    	String email = request.getParameter("email");
    	//리퀘스트 객체 안에 속성을 설정, "" 안에 이름, 그 다음은 값을 의미함 
    	request.setAttribute("id",id);
    	request.setAttribute("name",name);
    	request.setAttribute("email",email);
    	/* 리퀘스트가 넘어왔는지 확인 */
        System.out.println("Mail.java");
        System.out.println(id);
        System.out.println(name);
        System.out.println(email);
        
        //받을 이메일 주소 입력 (수신자) 
        //조회한 DB에서 이메일을 가져옴 
		String receiveMail = request.getParameter("email");
		
		//난수발생해서 인증 번호 생성 (6자리)
		String code = "";
		for(int i=0;i<6;i++) {
			code +=(int)(Math.random()*9 +1);
		}
		//console에 인증번호 확인
		System.out.println(code);
		
		//발송할 이메일 주소(발신자)
		String googleId = "webstudtest@gmail.com";
		//발송할 이메일 비밀번호
		String password = "webstud0311";
		
		//아래는 보안 버전과 java의 버전이 안맞을 경우 오류가 나는데 그때 주석해제
		//System.setProperty("https.prot_ocols", "TLSv1,TLSv1.1,TLSv1.2");
		
		//hashmap와 비슷한 기능을 가진 class로 hash테이블 상속받은 클래스
		//키와 값으로 값을 처리할 수 있음.
		Properties prop = new Properties();
		
		//아래는 구글에서 메일을 보낼때 설정하는 설정 정보들
		//네이버, 다음등의 사이트마다 요구하는게 달라서 각 사이트의 개발자 정보 참조
		//메일 통신은 STMP라는 통신으로 주고받음
        prop.put("mail.smtp.host", "smtp.gmail.com");
        prop.put("mail.smtp.port", 465);
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.trust", "smtp.gmail.com");
        //ssl관련 오류가나면 주석해제
        //prop.put("mail.smtp.starttls.enable","true");
        //설정된 정보와 javax.mail의 객체를 생성
        Session session = Session.getDefaultInstance(prop, new javax.mail.Authenticator() {
        	protected PasswordAuthentication getPasswordAuthentication() {
        		return new PasswordAuthentication(googleId,password);
        	}
        });
        try {
        	//53번 라인에서 생성한 객체를 MimeMessage를 통해서 메일  작성 준비
        	MimeMessage message = new MimeMessage(session);
        	
        	//발신자 정보
            message.setFrom(new InternetAddress(googleId));
            // 수신자 메일 주소
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail));
            // 메일의 제목
            message.setSubject("안녕하세요 (주)WebStudTest입니다.");
            // 메일의 내용
            message.setText("인증코드는 ["+code+"]입니다!");
            //작성한 메일을 전송
            Transport.send(message);
        //아래는 에러처리
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
           request.setAttribute("code", code);
        RequestDispatcher send = request.getRequestDispatcher("mail.jsp");
        send.forward(request, response);
	}
}

 

mail.jsp

<%@page import="miniProjectPrivateBMK_memberFrm.MemberVO"%>
<%@page import="miniProjectPrivateBMK_memberFrm.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	MemberDAO dao = new MemberDAO();
	MemberVO vo = new MemberVO();
	//전송된 리퀘스트를 가져옴
	String id = request.getParameter("id");
	String name = request.getParameter("name");	
	String email = request.getParameter("email");
	/* 리퀘스트가 넘어왔는지 확인 */
	System.out.println("mail.jsp");
	System.out.println(id);
	System.out.println(name);
	System.out.println(email);
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>인증코드 확인창</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<script type="text/javascript">
	/* 발송한 인증코드와 입력한 인증코드가 맞다면, MSMSP로 넘기는 작업 */
	function code_send() { 
	 	var v1 = document.querySelector('#code').value;
		var v2 = document.querySelector('#code_check').value;
	 	if (v1 != v2){
	 		alert("인증코드를 다시 입력해주세요");
	 	}
	 	else{
	 		mailCode.method = "post";
		 	mailCode.action = "MSMSP";
		 	mailCode.submit();
	 	}	 	
	 }
	</script>
</head>
	<body>
	<div>
		<form id="codeVerify" name="mailCode" method="post">
			<table>
				<tr>
					<td><span>인증코드</span></td>
					<td><input type="text" name="code" id="code" placeholder="인증코드를 입력하세요."></td>
					<td><input type="hidden" name="code_check" id="code_check" value="<%=request.getAttribute("code")%>"></td>
					<!-- 받은 리퀘스트 값을 Javascript 액션으로 보냄 -->
					<td><input type="hidden" name="id" id="code_check" value="<%=request.getAttribute("id")%>"></td>
					<td><input type="hidden" name="email" id="code_check" value="<%=request.getAttribute("email")%>"></td>
					<td><input type="hidden" name="name" id="code_check" value="<%=request.getAttribute("name")%>"></td>
					<td><input type="submit" onclick="code_send()" value="코드 보내기"/>
				</tr>
			</table>
		</form>
		</div>
	</body>

MemberDAO.java

package miniProjectPrivateBMK_memberFrm;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.sql.DataSource;
/*
 * id varchar2(10) NOT NULL 
	, pw varchar2(15) NOT NULL
	, name varchar2(30) NOT NULL
	, age number(3) NOT NULL
	, gender varchar2(3) NOT NULL 
	, phone varchar2(20) NOT NULL
	, email varchar2(100) NOT NULL
	, address varchar2(1000) NOT NULL 
	, regidate DATE DEFAULT sysdate NOT NULL
	, PRIMARY KEY(id)
 */
public class MemberDAO {
	
	private Connection conn;
	private PreparedStatement pstmt;
	private DataSource dataFactory;		
	private ResultSet rs;

	
	public MemberDAO() {
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context)ctx.lookup("java:/comp/env"); 	//JDNI에 접근하기 위해 기본경로를 지정함
			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");		// 톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴 
		} catch (NamingException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}
    
    public String searchPwd(MemberVO memberVO) {
		// pw값을 null 
		String result = "";	
		// 조회한 레코드의 각 컬럼 값을 받아옴
		String id = memberVO.getId();
		String name = memberVO.getName();
		String email = memberVO.getEmail();
		// 조회한 값이 제대로 넘어왔는지 확인
		System.out.println("아이디:"+id);
		System.out.println("이름:"+name);
		System.out.println("이메일"+email);

		try {
			conn = dataFactory.getConnection();	//DataSource를 이용해 DB 연결 
			String query = "SELECT pw from memberform";
			query += " WHERE id=? AND name=? AND email=?";
			
			//메서드로 전달된 아이디,이름,이메일을 이용해 SQL문을 작성한 후 DB에 조회함 
			pstmt = conn.prepareStatement(query);//prepareStatement() 메서드에 SQL문을 전달해 객체 생성함 
			pstmt.setString(1, id);	// 첫번째 '?'에 전달된 id를 인자로 넣음 
			pstmt.setString(2, name);// 두번째 '?'에 전달된 name을 인자로 넣음 
			pstmt.setString(3, email);// 세번째 '?'에 전달된 email을 인자로 넣음 
			//미리 설정한 SQL문을 실행함 
			ResultSet rs = pstmt.executeQuery();
			rs.next();
			result = rs.getString("pw");
			
		} catch (SQLException e) {
			e.printStackTrace();
			e.getMessage();
		}
		 System.out.println("pw = " + result);
		 return result;
	}
}

 

 

 

package miniProjectPrivateBMK_memberFrm;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/miniProject/html/MSMSP")		//서블릿 매핑 이름 
public class MSMSP extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		//전송된 리퀘스트를 가져옴
		String id = request.getParameter("id");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		//전송된 리퀘스트 값이 제대로 왔는지 확인
		System.out.println(id);
		System.out.println(name);
		System.out.println(email);
		
		MemberVO memberVO = new MemberVO();
		// memberVO를 만들어서 리퀘스트에서 불러온 값을 저장 
		memberVO.setId(id);
		memberVO.setName(name);
		memberVO.setEmail(email);
		
		MemberDAO dao = new MemberDAO();
		String pw = dao.searchPwd(memberVO);
		PrintWriter out = response.getWriter();

		out.print("<html><body><div>");
		out.print("메일로 인증코드를 전송하였습니다. 확인해주세요. <br>");
		out.print("비밀번호는 "+dao.searchPwd(memberVO)+"입니다. <br>");
		out.print("<a href='login.html'>로그인 창으로 이동</a></div></body></html>");
	}
}

"찾기" 버튼을 누르면, 서블릿이 제대로 작동했는지 확인하기 위해 작성해놓은 System.out.println()을 통해 값이 나옴

 

메일에서 받은 인증코드 입력

(현재 console에서 나온 값을 통해서 인증코드를 입력하였지만, 본 계정 메일에 보내면 메일로 인증코드가 보내짐)

인증코드 입력후, 비밀번호를 알려주고, "로그인 창으로 이동" 을 클릭하여 로그인 실행

728x90
반응형

'Project Development > Java_programming' 카테고리의 다른 글

게시판 만들기 - model1 방식  (0) 2021.12.20
공지사항 페이지 레이아웃  (0) 2021.12.15
아이디 찾기 - DB 연결  (0) 2021.12.15
회원가입 - DB 연결  (0) 2021.12.14
쇼핑몰 홈페이지  (0) 2021.12.14

댓글