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 |
댓글