로그인은 mysql과 연동하여 회원 아이디가 존재하면 통과 시키며
카카오와 구글 api를 활용하여 간편 로그인 기능을 구현 하였다.
회원가입은 각 텍스트 필드당 들어가야할 값들을 유효성 검사를 통하여
검사가 통과 되지 않는다면 회원 가입을 시키지 않는다.
만약 유효성을 통과 해도 이미 존재하는 아이디면 허용하지 않는다.
또한 아이디 검사를 ajax를 활용하여 사용자가 회원 가입 버튼을 누르지 않아도
아이디를 입력하면서 사용자가 사용할 수 있는 아이디를 판단하여 준다.
회원가입 jsp
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<!-- 구글 로그인 -->
<!-- <meta name="google-signin-scope" content="profile email"> -->
<meta name="google-signin-client_id" content="클라이언트 아이디">
<!-- 구글 로그인 -->
<title>ThrowsGG</title>
<!-- MDB icon -->
<link rel="icon" href="img/mdb-favicon.ico" type="image/x-icon" />
<!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" />
<!-- Google Fonts Roboto -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700;900&display=swap" />
<!-- MDB -->
<link rel="stylesheet" href="css/mdb.min.css" />
<!-- Prism -->
<link rel="stylesheet" href="https://mdbgo.io/mikolaj-smolenski/mdb5-demo-pro/dev/css/new-prism.css" />
<!-- Custom styles -->
<style>
body {
position: relative;
padding-top: 0;
}
main {
padding-left: 240px;
}
</style>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="https://fonts.googleapis.com/css?family=Montserrat:200,300,400,500,600,700,800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="css/animate.css">
<link rel="stylesheet" href="css/owl.carousel.min.css">
<link rel="stylesheet" href="css/owl.theme.default.min.css">
<link rel="stylesheet" href="css/magnific-popup.css">
<link rel="stylesheet" href="css/bootstrap-datepicker.css">
<link rel="stylesheet" href="css/jquery.timepicker.css">
<link rel="stylesheet" href="css/flaticon.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body data-mdb-spy="scroll" data-mdb-target="#scrollspy1" data-mdb-offset="1" class="scrollspy-example">
<!-- YOUR WORK HERE -->
<jsp:include page="Nav.jsp"></jsp:include>
<main>
<div class="container my-5">
<div class="row">
<!-- Left column -->
<div class="col-md-10 mb-4 mb-md-0">
<!--Section: Docs content-->
<section>
<!--Section: login register example-->
<section id="section-login-register-example">
<!-- Section title -->
<h2 class="my-5 mb-2">Login - register</h2>
<!-- Section: Demo -->
<section class="border p-4 text-center w-100 rounded-top">
<div class="container d-flex flex-column w-50">
<!-- Pills navs -->
<ul class="nav nav-pills nav-justified mb-3" id="ex1" role="tablist">
<li class="nav-item" role="presentation"><a class="nav-link active" id="tab-login" data-mdb-toggle="pill" href="#pills-login" role="tab" aria-controls="pills-login" aria-selected="true">Login</a></li>
<li class="nav-item" role="presentation"><a class="nav-link" id="tab-register" data-mdb-toggle="pill" href="#pills-register" role="tab" aria-controls="pills-register" aria-selected="false">Register</a></li>
</ul>
<!-- Pills navs -->
<!-- Pills content -->
<!-- 로그인 시작 -->
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-login" role="tabpanel" aria-labelledby="tab-login">
<!-- <form> -->
<!-- Email input -->
<div class="form-outline mb-4">
<input type="text" id="loginid" class="form-control" /> <label class="form-label" for="loginName">id</label>
</div>
<!-- Password input -->
<div class="form-outline mb-4">
<input type="password" id="loginPassword" class="form-control" /> <label class="form-label" for="loginPassword">Password</label>
</div>
<div class="alert alert-danger" id="login-danger">아이디나 비밀번호를 다시 확인하세요.</div>
<!-- 2 column grid layout -->
<div class="row mb-4">
<div class="col-md-6 d-flex justify-content-center">
<!-- Simple link -->
<a href="Findpassword.jsp">Forgot password?</a>
</div>
</div>
<!-- Submit button -->
<button type="submit" onclick=signup() id="loginbutton" class="btn btn-primary btn-block mb-4">Sign in</button>
<!-- Register buttons -->
<div class="text-center">
<p>
Not a member? <a href="#!">Register</a>
</p>
</div>
<div class="row mb-4" style="text-align: center; display :inline-block;">
<a class="btn" href="javascript:void(0)" onclick= kakaoLogin() >
<img
src="//k.kakaocdn.net/14/dn/btqCn0WEmI3/nijroPfbpCa4at5EIsjyf0/o.jpg"
width="240"
/>
</a>
<!-- <li onclick="kakaoLogout();"> -->
<!-- <a href="javascript:void(0)"> -->
<!-- <span>카카오 로그아웃</span> -->
<!-- </a> -->
<!-- </li> -->
</ul>
<!-- 간편 로그인 -->
<script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
<!-- 간편 로그인 -->
<script>
Kakao.init('클라이언트 아이디'); //발급받은 키 중 javascript키를 사용해준다.
console.log(Kakao.isInitialized()); // sdk초기화여부판단
//카카오로그인
function kakaoLogin() {
var id = null;
var nickname = null;
var email = null;
Kakao.Auth.login({
success: function (response) {
Kakao.API.request({
url: '/v2/user/me',
data: {
property_keys: ["kakao_account.email","id", "properties.nickname","properties.profile_image"]
},
success: function (response) {
console.log(response)
console.log(response);
// 아이디
id = response.id;
email = response.kakao_account.email;
// 닉네임
nickname = response.properties.nickname;
img = response.properties.profile_image;
$.ajax({
type: "post",
url: "easylogin.lg",
dataType: "text",
data: {
id: id,
email: email,
nickname: nickname,
img: img
}
}).done(function(data) {
if (data != "null") {
window.location.href = "index.jsp";
} else {
alert("fail");
}
}).error(function(data) {
alert("error");
})
},
fail: function (error) {
console.log(error)
},
})
},
fail: function (error) {
console.log(error)
},
})
}
</script>
<!-- 구글 로그인 -->
<script src="https://accounts.google.com/gsi/client" async defer></script>
<script src="https://apis.google.com/js/platform.js" async defer></script>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
function handleCredentialResponse(response) {
const responsePayload = parseJwt(response.credential);
console.log("ID: " + responsePayload.sub);
console.log('Full Name: ' + responsePayload.name);
console.log('Given Name: ' + responsePayload.given_name);
console.log('Family Name: ' + responsePayload.family_name);
console.log("Image URL: " + responsePayload.picture);
console.log("Email: " + responsePayload.email);
$.ajax({
type: "post",
url: "easylogin.lg",
dataType: "text",
data: {
id: responsePayload.sub,
email: responsePayload.email,
nickname: responsePayload.name,
img: responsePayload.picture
}
}).done(function(data) {
if (data != "null") {
window.location.href = "index.jsp";
} else {
alert("fail");
}
}).error(function(data) {
alert("error");
})
}
function parseJwt (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
};
window.onload = function () {
google.accounts.id.initialize({
client_id: "클라이언트 아이디",
callback: handleCredentialResponse
});
google.accounts.id.renderButton(
document.getElementById("buttonDiv"),
{ theme: "outline", size: "large" } // customization attributes
);
google.accounts.id.prompt(); // also display the One Tap dialog
}
</script>
<div id="buttonDiv" class="g-signin2" data-width="240" data-height="50" style="margin-left: 5px;"></div>
</div>
<!-- 구글 로그인 -->
<!-- </form> -->
</div>
<!-- 로그인 부분 끝 -->
<!-- 회원 가입 부분 -->
<div class="tab-pane fade" id="pills-register" role="tabpanel" aria-labelledby="tab-register">
<form class="row g-3 needs-validation" novalidate name="formregister" method="post" action="insert.lg" encType="UTF-8">
<!-- id input -->
<div class="form-outline mb-4">
<input type="text" id="id" name="id" class="form-control" required minlength="5" maxlength="20" placeholder="5자 이상" /> <label class="form-label" for="registerEmail">id</label>
</div>
<div class="alert alert-danger" id="id-danger">사용중인 아이디 입니다.</div>
<div class="alert alert-success" id="id-success">사용 가능한 아이디 입니다.</div>
<div class="alert alert-danger" id="id-danger2">사용 불가 아이디 입니다.</div>
<!-- Password input -->
<div class="form-outline mb-4">
<input type="password" id="registerPassword" name="password" class="form-control" required pattern="(?=.*\d)(?=.*[a-zA-Z])(?=.*[0-9]).{8,}" minlength="8" maxlength="20" placeholder="숫자와 영어 포함 8자 이상" /> <label class="form-label" for="registerPassword">Password</label>
</div>
<!-- Repeat Password input -->
<div class="form-outline mb-4">
<input type="password" id="registerRepeatPassword" class="form-control" required pattern="(?=.*\d)(?=.*[a-zA-Z])(?=.*[0-9]).{8,}" minlength="8" maxlength="20" /> <label class="form-label" for="registerRepeatPassword">Repeat password</label>
</div>
<div class="alert alert-danger" id="alert-danger">비밀번호가 일치하지 않습니다.</div>
<div class="alert alert-success" id="alert-success">비밀번호가 일치합니다.</div>
<!-- Nickname input -->
<div class="form-outline mb-4">
<input type="text" id="nickname" class="form-control" name="nickname" required minlength="2" maxlength="20" placeholder="2자 이상" /> <label class="form-label" for="registerName">Nickname</label>
</div>
<!-- name input -->
<div class="form-outline mb-4">
<input type="text" id="name" class="form-control" name="name" required minlength="2" maxlength="20" placeholder="2자 이상" /> <label class="form-label" for="registerName">name</label>
</div>
<!-- phone input -->
<div class="form-outline mb-4">
<input type="tel" class="form-control" name="phone" id="phone" required pattern="[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}" maxlength="13" placeholder=" - 자동" /> <label class="form-label" for="registerUsername">phone number</label>
</div>
<!-- Email input -->
<div class="form-outline mb-4">
<input type="email" id="email" name="email" class="form-control" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" maxlength="30" placeholder="ex)abc123@gmail.com" /> <label class="form-label" for="loginName">Email</label>
</div>
<!-- Submit button -->
<button type="submit" onclick=register() class="btn btn-primary btn-block mb-3" id="submit">회원 가입</button>
</form>
</div>
</div>
<!-- Pills content -->
</div>
</section>
<!-- Section: Demo -->
</section>
<!--Section: login register example-->
</section>
</div>
<!-- Left column -->
</div>
</div>
</main>
<!-- Prism -->
<script type="text/javascript" src="https://mdbgo.io/mikolaj-smolenski/mdb5-demo-pro/dev/js/new-prism.js"></script>
<script type="text/javascript" src="https://mdbgo.io/mikolaj-smolenski/mdb5-demo-pro/dev/js/dist/mdbsnippet.min.js"></script>
<!-- MDB -->
<script type="text/javascript" src="js/mdb.min.js"></script>
<!-- Custom scripts -->
<script type="text/javascript"></script>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="js/jquery.min.js"></script>
<script src="js/jquery-migrate-3.0.1.min.js"></script>
<script src="js/popper.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jquery.easing.1.3.js"></script>
<script src="js/jquery.waypoints.min.js"></script>
<script src="js/jquery.stellar.min.js"></script>
<script src="js/jquery.animateNumber.min.js"></script>
<script src="js/bootstrap-datepicker.js"></script>
<script src="js/jquery.timepicker.min.js"></script>
<script src="js/owl.carousel.min.js"></script>
<script src="js/jquery.magnific-popup.min.js"></script>
<script src="js/scrollax.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBVWaKrjvy3MaE7SQ74_uJiULgl1JY0H2s&sensor=false"></script>
<script src="js/google-map.js"></script>
<script src="js/main.js"></script>
<!-- YOUR WORK HERE -->
<script src="js/telcheck.js"></script>
<script src="js/login-check.js"></script>
<script src="js/repeatPW.js"></script>
<script src="js/idoverlapcheck.js"></script>
<script src="js/join.js"></script>
<script src="js/signup.js"></script>
<script src="js/otherspace.js"></script>
<script src="js/loginspace.js"></script>
</body>
</html>
핸드폰 번호 입력시 자동 하이픈 js
/**
*
*/
var autoHypenPhone = function(str){
str = str.replace(/[^0-9]/g, '');
var tmp = '';
if( str.length < 4){
return str;
}else if(str.length < 7){
tmp += str.substr(0, 3);
tmp += '-';
tmp += str.substr(3);
return tmp;
}else if(str.length < 11){
tmp += str.substr(0, 3);
tmp += '-';
tmp += str.substr(3, 3);
tmp += '-';
tmp += str.substr(6);
return tmp;
}else{
tmp += str.substr(0, 3);
tmp += '-';
tmp += str.substr(3, 4);
tmp += '-';
tmp += str.substr(7);
return tmp;
}
return str;
}
var phoneNum = document.getElementById('phone');
phoneNum.onkeyup = function(){
console.log(this.value);
this.value = autoHypenPhone( this.value ) ;
}
비밀번호 반복 확인 js
var repeatpassword = document.getElementById('registerRepeatPassword');
document.getElementById('alert-success').style.display = 'none';
document.getElementById('alert-danger').style.display = 'none';
var repeatpw = null;
repeatpassword.onkeyup = function repeat(){
var p1 = document.getElementById('registerPassword').value;
var p2 = document.getElementById('registerRepeatPassword').value;
if(window.event.keyCode == 32) { // 공백 체크
this.value = p2.trim();
}else{
if(p1 !="" || p2 != ""){
if( p1 != p2 ) {
document.getElementById('alert-success').style.display = 'none';
document.getElementById('alert-danger').style.display = '';
repeatpw = false;
} else{
document.getElementById('alert-danger').style.display = 'none';
document.getElementById('alert-success').style.display = '';
repeatpw = true;
}
}
}
};
var password = document.getElementById('registerPassword');
password.onkeyup = function repeat(){
var p1 = document.getElementById('registerPassword').value;
var p2 = document.getElementById('registerRepeatPassword').value;
if(window.event.keyCode == 32) { // 공백 체크
this.value = p1.trim();
}else{
if(p1 !="" || p2 != ""){
if( p1 != p2 ) {
document.getElementById('alert-success').style.display = 'none';
document.getElementById('alert-danger').style.display = '';
repeatpw = false;
} else{
document.getElementById('alert-danger').style.display = 'none';
document.getElementById('alert-success').style.display = '';
repeatpw = true;
}
}
}
};
비밀번호에 공백이 들어가지 않게 방지하며
비밀번호가 서로 다르다면 다르다고 바로 바로 알려주는 코드이다.
아이디 중복 체크 js
/**
*
*/
// <!-- id 중복 확인 체크 -->
// 아이디와 비밀번호가 맞지 않을 경우 가입버튼 비활성화를 위한 변수설정
//아이디 체크하여 가입버튼 비활성화, 중복확인.
var idTF = true;
document.getElementById('id-danger2').style.display = 'none';
document.getElementById('id-success').style.display = 'none';
document.getElementById('id-danger').style.display = 'none';
$("#id").keyup(function checkId() {
var inputed = $('#id').val();
// var str_space = /\s/; // 공백 체크
if (window.event.keyCode == 32) { // 공백 체크
this.value = inputed.trim();
} else {
$.ajax({
type: "POST",
url: "checkid.lg",
dataType: "text",
data: { id: inputed },
}).done(function(data) {
if (data == "fail") {
document.getElementById('id-success').style.display = 'none';
document.getElementById('id-danger2').style.display = 'none';
document.getElementById('id-danger').style.display = '';
idTF = true;
} else if (data == "success") {
document.getElementById('id-danger').style.display = 'none';
document.getElementById('id-danger2').style.display = 'none';
document.getElementById('id-success').style.display = '';
idTF = false;
} else {
document.getElementById('id-success').style.display = 'none';
document.getElementById('id-danger').style.display = 'none';
document.getElementById('id-danger2').style.display = '';
idTF = true;
}
}).error(function(data) {
document.getElementById('id-success').style.display = 'none';
document.getElementById('id-danger2').style.display = 'none';
document.getElementById('id-danger').style.display = '';
idTF = true;
})
}
});
회원 가입 확인 js
function register() {
var formregister = document.formregister;
var nickname = document.getElementById('nickname');
var name = document.getElementById('name');
var phoneNum = document.getElementById('phoneNum');
var email = document.getElementById('email');
var id = document.getElementById('id');
var password = repeatpw;
if (name.checkValidity() && nickname.checkValidity() && phoneNum.checkValidity() && email.checkValidity() && id.checkValidity() && password && !idTF) {
formregister.method = "post";
formregister.action = "insert.lg";
formregister.submit(); // 자바스크립트에서 서블릿으로 전송
} else {
}
}
회원 가입시 각 input의 유효성을 확인하고 전부 true로 만족할시에 통과 하며 form태그속 정보를 서블릿으로
전송하여 sql문을 실행 시킴
각 input 공백 방지 js
/**
*
*/
var names = document.getElementById('name');
names.onkeyup = function checkname() {
var namevalue = document.getElementById('name').value;
if (window.event.keyCode == 32) { // 공백 체크
this.value = namevalue.trim();
}
}
var nickname = document.getElementById('nickname');
nickname.onkeyup = function repeat() {
var nick = document.getElementById('nickname').value;
if (window.event.keyCode == 32) { // 공백 체크
this.value = nick.trim();
}
}
var email = document.getElementById('email');
email.onkeyup = function repeat() {
var emailvalue = document.getElementById('email').value;
if (window.event.keyCode == 32) { // 공백 체크
this.value = ''; // 커서가 앞으로가는 오류 해결
this.value = emailvalue.trim();
}
}
회원 가입 서블릿
package controller;
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;
import javax.servlet.http.HttpSession;
import action.Action;
import dao.BoardStatus;
import dao.LoginDAO;
import dao.MemberDAO;
import dao.MemberInsertDAO;
import dao.MemberUpdateDAO;
import dao.Sens_sms_v2;
import mailsender.MailController;
import vo.ActionForward;
import vo.LoginUser;
/**
* Servlet implementation class loginController
*/
@WebServlet("*.lg")
public class loginController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public loginController() {
super();
// TODO Auto-generated constructor stub
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String RequestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = RequestURI.substring(contextPath.length());
ActionForward forward = null;
Action action = null;
if (command.equals("/checkid.lg")) { // 회원가입시
String id = request.getParameter("id"); // ajax값 가져오기
// if(id.length() <= 4 && id.length() >0) {
// response.getWriter().write("tooshort");
// }
System.out.println(id);
MemberDAO member = new MemberDAO();
response.getWriter().write(new MemberDAO().idCheck(id) + "");
} else if (command.equals("/insert.lg")) {
MemberInsertDAO insert = new MemberInsertDAO();
String id = request.getParameter("id");
String pw = request.getParameter("password");
String nickname = request.getParameter("nickname");
String name = request.getParameter("name");
String phoneNum = request.getParameter("phone");
String email = request.getParameter("email");
System.out.println(name + " " + phoneNum + " " + email + " " + id + " " + pw);
insert.insertMember(id, pw, nickname, name, email, phoneNum);
response.sendRedirect("Welcome.jsp");
} else if (command.equals("/login.lg")) {
HttpSession session = request.getSession(true);
LoginDAO login = new LoginDAO();
String id = request.getParameter("id");
String pw = request.getParameter("pw");
System.out.println("login : " + id + " " + pw);
LoginUser check = new LoginDAO().checkInfo(id, pw);
if (check != null) { // 로그인한 회원의 정보 세션에 저장
session.setAttribute("id", id);
session.setAttribute("password", pw);
session.setAttribute("email", check.getEmail());
session.setAttribute("phone", check.getPhone());
session.setAttribute("name", check.getName());
session.setAttribute("nickname", check.getNickname());
session.setAttribute("profile", check.getProfile());
session.setAttribute("joinDate", check.getJoinDate());
session.setAttribute("user", check);
}
System.out.println(check + "");
response.getWriter().write(check + "");
} else if (command.equals("/infochange.lg")) {
MemberUpdateDAO update = new MemberUpdateDAO();
HttpSession session = request.getSession();
String img = request.getParameter("img");
String nickname = request.getParameter("nickname");
String name = request.getParameter("name");
String phoneNum = request.getParameter("phone");
String email = request.getParameter("email");
String id = (String) session.getAttribute("id");
update.updateMember(id, nickname, name, email, phoneNum,img);
session.setAttribute("profile", img);
session.setAttribute("email", email);
session.setAttribute("phone", phoneNum);
session.setAttribute("name", name);
session.setAttribute("nickname", nickname);
System.out.println(nickname + " " + name + " " + phoneNum + " " + email);
// PrintWriter writer = response.getWriter();
// writer.println("<script> location.replace('userinfo.jsp');</script>");
// writer.close();
// RequestDispatcher rd = request.getRequestDispatcher("/userinfo.jsp");
// rd.forward(request, response);
response.getWriter().write(true + "");
} else if (command.equals("/checkMail.lg")) {
HttpSession session = request.getSession(true);
String id = request.getParameter("id");
String email = request.getParameter("email");
System.out.println("checkMail : " + id + " " + email);
boolean mailCheck = new LoginDAO().checkMail(id, email);
// if(mailCheck == true) {
// System.out.println("asdsadasdsadasdasd");
// response.sendRedirect("sendMail.lg");
//// RequestDispatcher rd = request.getRequestDispatcher("sendMail.lg");
// response.getWriter().write(mailCheck + "");
// }else {
response.getWriter().write(mailCheck + "");
} else if (command.equals("/sendMail.lg")) {
String email = request.getParameter("email");
String id = request.getParameter("id");
System.out.println("sendMail" + email);
String fakePw = new MailController().getRandomPw();
new LoginDAO().updateFakePw(id, fakePw);
new MailController(id, email, fakePw).start();
System.out.println(fakePw + "asdasd");
// response.sendRedirect("afterSendPw.jsp");
} else if(command.equals("/pwcheck.lg")) {
LoginDAO check = new LoginDAO();
HttpSession session = request.getSession();
String pw = request.getParameter("pw");
String id = (String) session.getAttribute("id");
LoginUser cpw = check.checkInfo(id, pw);
System.out.println("cpw : "+cpw);
if(cpw != null) {
RequestDispatcher rd = request.getRequestDispatcher("/changepw.lg");
rd.forward(request, response);
}else {
response.getWriter().write("password error");
}
}else if(command.equals("/changepw.lg")) {
MemberUpdateDAO update = new MemberUpdateDAO();
HttpSession session = request.getSession();
String npw = request.getParameter("npw");
String nrpw = request.getParameter("nrpw");
String id = (String) session.getAttribute("id");
update.updatepw(id, npw, nrpw);
response.getWriter().write("success");
}else if(command.equals("/delinfo.lg")) {
HttpSession session = request.getSession();
MemberDAO del = new MemberDAO();
int index = Integer.parseInt(request.getParameter("id"));
System.out.println("index : " + index);
del.delinfo(index);
String msgComments = (String) session.getAttribute("id")+" 님의 상담신청번호 : "+index+" 의 예약취소가 성공적으로 완료되었습니다";
Sens_sms_v2 sms = new Sens_sms_v2();
sms.sendSMS(msgComments, "0"+request.getParameter("phonenNm").replace("-",""));
response.getWriter().write("ok");
}else if(command.equals("/delall.lg")) {
System.out.println("delall into");
MemberDAO del = new MemberDAO();
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
System.out.println("id : " + id);
del.delall(id);
// response.getWriter().write("ok");
// session.invalidate();
response.sendRedirect("logout.jsp");
}else if(command.equals("/changeStatus.lg")) {
System.out.println("change 들어옴");
BoardStatus bs = new BoardStatus();
int num = Integer.parseInt(request.getParameter("num"));
bs.changeStatus(num);
response.getWriter().write("ok");
}else if(command.equals("/easylogin.lg")) {
System.out.println("easylogin 들어옴");
MemberInsertDAO easy = new MemberInsertDAO();
String id = request.getParameter("id");
String nickname = request.getParameter("nickname");
String email = request.getParameter("email");
String img = request.getParameter("img");
LoginUser check = easy.easylogin(id, email, nickname,img);
HttpSession session = request.getSession(true);
session.setAttribute("id", check.getId());
session.setAttribute("password", check.getPassword());
session.setAttribute("email", check.getEmail());
session.setAttribute("phone", check.getPhone());
session.setAttribute("name", check.getName());
session.setAttribute("nickname", check.getNickname());
session.setAttribute("profile", check.getProfile());
session.setAttribute("joinDate", check.getJoinDate());
session.setAttribute("user", check);
response.getWriter().write("ok");
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request, response);
}
}
memberinsertDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import vo.LoginUser;
public class MemberInsertDAO {
private Connection con;
public MemberInsertDAO() {
System.out.println("it me!");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("DRIVER LOADING.....");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/throwsgg?user=root&password=1234");
System.out.println("Connection success!");
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean insertMember(String id, String pw, String nickname, String name, String email,String phone) {
PreparedStatement pstmt = null;
ResultSet rs = null;
String key = "1234";
String SQL = "INSERT INTO member (profile,nickname,name,phone,email,id,password) values (?,?,?,?,?,?,HEX(AES_ENCRYPT(?,?)))";
System.out.println(SQL);
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, "저장할 이미지 url");
pstmt.setString(2, nickname);
pstmt.setString(3, name); // ?에 들어갈 것
pstmt.setString(4, phone);
pstmt.setString(5, email);
pstmt.setString(6, id);
pstmt.setString(7, pw);
pstmt.setString(8, key);
System.out.println("insert : " + name + " " + phone + " " + email + " " + id + " " + pw + " " +nickname);
pstmt.executeUpdate();
System.out.println("insert!!");
return true;
} catch (Exception e) {
System.out.println("insert fail!!");
return false;
}
}public LoginUser easylogin(String id, String email, String nickname, String img) {
LoginUser user =easycheck(id);
if(user == null) {
PreparedStatement pstmt = null;
ResultSet rs = null;
String SQL = "INSERT INTO member (profile,nickname,name,email,id) values (?,?,?,?,?)";
System.out.println(SQL);
try {
pstmt = con.prepareStatement(SQL);
if(img == null) {
img = "기본 이미지 url";
}
pstmt.setString(1, img);
pstmt.setString(2, nickname);
pstmt.setString(3, nickname); // ?에 들어갈 것
pstmt.setString(4, email);
pstmt.setString(5, id);
pstmt.executeUpdate();
LoginUser newuser = new LoginUser(id, null, nickname, nickname,
null, email,img,null);
return newuser; // 이미 존재하는 아이디
} catch (Exception e) {
System.out.println("insert fail!!");
}
}else {
return user;
}
return null;
}
public LoginUser easycheck(String id) {
PreparedStatement pstmt = null;
ResultSet rs = null;
String SQL = "select * from member where id = ?";
System.out.println(SQL);
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
LoginUser user = new LoginUser(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4),
rs.getString(5), rs.getString(6),rs.getString(7),rs.getDate(8));
return user; // 이미 존재하는 아이디
}else {
return null;
}
} catch (Exception e) {
System.out.println("select fail!!");
}
return null;
}
}
loginDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import vo.LoginUser;
public class LoginDAO {
private Connection con;
public LoginDAO() {
System.out.println("it me!");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("DRIVER LOADING.....");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/throwsgg?user=root&password=1234");
System.out.println("Connection success!");
} catch (Exception e) {
e.printStackTrace();
}
}
public LoginUser checkInfo(String id, String pw) {
PreparedStatement pstmt = null;
ResultSet rs = null;
String SQL = "select id,AES_DECRYPT(UNHEX(password), ?),name,email,phone,nickname,profile,date from member where id = ? AND password = HEX(AES_ENCRYPT(?,?));";
System.out.println(SQL);
String key = "1234";
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, key);
pstmt.setString(2, id); // ?에 들어갈 것
pstmt.setString(3, pw);
pstmt.setString(4, key);
System.out.println("login : " + id + " " + pw);
rs = pstmt.executeQuery();
System.out.println("login!!");
if (rs.next()) { // 결과가 있다면
System.out.println("복호화 패스워드 : " + rs.getString(2));
LoginUser user = new LoginUser(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4),
rs.getString(5), rs.getString(6),rs.getString(7),rs.getDate(8));
return user; // 이미 존재하는 아이디
} else {
return null; // 가입 가능한 아이디
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("login fail!!");
}
return null;
}
public boolean checkMail(String id, String email) {
PreparedStatement pstmt = null;
ResultSet rs = null;
String SQL = "select email from member where id = ? AND email = ?";
System.out.println(SQL);
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, id); // ?에 들어갈 것
pstmt.setString(2, email);
System.out.println("senddddd : " + id + " " + email);
rs = pstmt.executeQuery();
System.out.println("sendMaillllll");
if (rs.next()) { // 결과가 있다면
System.out.println("strue");
return true; // 존재하는회원
} else {
System.out.println("senfalse");
return false; // 존재안하는 회원
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("sendmail fail!!");
}
return false;
}
public void updateFakePw(String id, String pw) {
PreparedStatement pstmt = null;
ResultSet rs = null;
String key = "1234";
String SQL = "update member set password=HEX(AES_ENCRYPT( ? ,? )) where id=?";
System.out.println(SQL);
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, pw); // ?에 들어갈 것
pstmt.setString(2, key);
pstmt.setString(3, id);
System.out.println("update : " + id + " " + pw);
pstmt.executeUpdate();
System.out.println("changeeee");
} catch (Exception e) {
e.printStackTrace();
System.out.println("updateeeeee fail!!");
}
}
}
회원가입시 대칭키 알고리즘을 활용하여 DB에 비밀번호가 직접적으로 입력되지 않게 하였다.
로그인시에는 대칭키 알고리즘으로 복호화 하여 회원이 입력한 비밀번호와 검사 시켰다.
Login User VO.java
package vo;
import java.util.Date;
public class LoginUser {
private String id;
private String password;
private String nickname;
private String name;
private String phone;
private String email;
private String profile;
private Date joinDate;
public LoginUser() {
this(null,null,null,null,null,null,null,null);
}
public LoginUser(String id, String password, String name, String email, String phone, String nickname,String profile, Date joinDate){
setId(id);
setPassword(password);
setNickname(nickname);
setName(name);
setPhone(phone);
setEmail(email);
setProfile(profile);
setJoinDate(joinDate);
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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 getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public Date getJoinDate() {
return joinDate;
}
public void setJoinDate(Date joinDate) {
this.joinDate = joinDate;
}
}
'자바' 카테고리의 다른 글
네이버 뉴스 크롤링 (0) | 2022.09.01 |
---|---|
마이페이지 기능 (0) | 2022.09.01 |
별 찍기 프로그램 (0) | 2022.08.03 |
메모리 영역 (0) | 2022.08.03 |
오버 로딩 과 오버 라이딩 (0) | 2022.08.03 |