반응형

로그인 구현하기

 

회원가입을 구현한 후 이어서 회원 가입된 데이터를 사용하여 로그인 기능을 구현한다.

로그인 페이지에서 입력한 IDPASSWORD를 데이터베이스에서 검색하고 비교하여 로그인할 수 있도록 구현

 

1. 로그인 동작 구현

DB에서 ID/PASSWORD를 비교하여 결과를 정수 값으로 반환하는 메서드를 DAO에 추가한다.

( 1 : 로그인 성공, 0 : 비밀번호 오류, -1 : ID없음 )

/src/memberone/MemberDao.java 에 다음 메서드 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public int loginCheck(String id, String pass){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    int check = -1;
    try{
        conn = getConnection();
        String query = "select PASS from MEMBER where ID = ?";
        pstmt = conn.prepareStatement(query);
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
        if(rs.next()){
            String dbPass = rs.getString("pass");
            if(pass.equals(dbPass))        check = 1;
            else                        check = 0;
        }
    }catch(Exception e){
        e.printStackTrace();
        System.out.println("Exception :  " + e);
    }finally{
        if(rs != null
            try{
                rs.close();
            }catch(SQLException sqle1){}
        if(pstmt != null
            try{
                pstmt.close();
            }catch(SQLException sqle2){}
        if(conn != null
            try{
                conn.close();
            }catch(SQLException sqle3){}
    }
    return check;
}
 
cs


다음으로 로그인 동작을 처리할 jsp페이지를 만든다.

/WebContent/memberone/loginProc.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean id="dao" class="memberone.MemberDao"/>
<%
    String id = request.getParameter("id");
    String pass = request.getParameter("pass");
    int check = dao.loginCheck(id, pass);
%>
<%
    if(check == 1){     //로그인 성공
        session.setAttribute("loginID", id); 
        response.sendRedirect("main.jsp");
    }
    else if(check == 0){    //비밀번호 틀림
%>
<script>
        alert("비밀번호가 틀렸습니다.");
        history.go(-1);
</script>
<% 
    }else//아이디 없음
%>
<script>
        alert("존재하지 않는 아이디입니다.");
        history.go(-1);
</script>
<%
    }
%>
cs


이제 로그인이 성공할 경우 main.jsp 페이지로 리다이렉트 하기 때문에 main.jsp페이지를 작성해야 한다.

먼저 로그인 세션을 검사하여 session값이 존재하면 로그인한 상태로 간주하도록 한다.


/WebContent/memberone/main.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%-- 로그인 폼 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%     String loginID = (String)session.getAttribute("loginID"); %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Login</title>
    <link href="css/style.css" rel="stylesheet" type="text/css">
    <link href="css/mainstyle.css" rel="stylesheet" type="text/css">
</head>
<body>
<section>
    <article class="logininfo">
    <% if(loginID != null){ %>
        <table>
            <tr><td colspan="3"><%= loginID %>님 환영합니다.</td></tr>
            <tr>
                <td class="infomenu"><a href="modifyForm.jsp">정보수정</a></td>
                <td class="infomenu"><a href="deleteForm.jsp">회원탈퇴</a></td>
                <td class="infomenu"><a href="logoutForm.jsp">로그아웃</a></td>
            </tr>
        </table>
    <% } else%>
    <script>
        alert("정상적인 접근이 아닙니다. 로그인 해 주세요.");
        location.href="login.jsp";
    </script>
    <% } %>    
    </article>
</section>
</body>
</html>
cs


login.jsp 코드의 <form>태그에 action="#"부분을 action="loginProc.jsp"로 수정한다.

모두 작성하였다면 login.jsp를 실행하여 로그인이 되는지 테스트 한다.


- CSS 추가

/WebContent/memberone/css/mainstyle.css 작성

1
2
3
4
5
6
7
8
9
10
11
12
@CHARSET "UTF-8";
section{
    width:200px;
    margin: auto;
    left:0; top:0; right:0; bottom:0;
}
.logininfo td a{
    background-color: #add2da;
    border:1px solid #8000ff;
    border-radius:2px;
    text-decoration:none;    
}
cs


요청결과>

로그인 화면                    입력

           


로그인 성공

위와 같이 로그인이 되었다면 이제 로그아웃 기능을 만들자.


2. 로그아웃 구현

로그아웃은 Session을 통해 로그인을 구별하므로 session값을 없애 줄 수 있으면 된다.

/WebContent/memberone/logoutForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%    session.invalidate(); %>
<!doctype html>
<html>
<head>
    <title>로그아웃</title>
    <link href="css/style.css" rel="stylesheet" type="text/css">
    <style>
    a{ text-decoration:none; }
    </style>
</head>
<body>
성공적으로 로그아웃 되었습니다.<br/><br/>
<a href="login.jsp">로그인 페이지로 이동</a>
</body>
</html>
 
cs


요청결과>

로그인 후 로그아웃 버튼 클릭


“로그인 페이지로 이동”을 클릭하면 로그인 페이지로 이동한다.


3. 정보수정 구현

정보 수정을 클릭하면 먼저 기존의 정보를 보여주어야 한다.

세션에 저장된 ID를 가지고 회원정보를 얻어올 메서드를 작성한다.

/src/memberone/MemberDao.java 클래스에 메서드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public MemberDto getMember(String id){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    MemberDto dto = null;
    try{
        conn = getConnection();
        pstmt = conn.prepareStatement("select * from MEMBER where ID = ?");
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
        if(rs.next()){    //ID에 해당하는 회원이 존재 한다면
            dto = new MemberDto();
            dto.setId(rs.getString("id"));
            dto.setPass(rs.getString("pass"));
            dto.setEmail(rs.getString("email"));
            dto.setRegdate(rs.getTimestamp("regdate"));
        }
    }catch(Exception e){
        e.printStackTrace();
        System.out.println("Exception :  " + e);
    }finally{
        if(rs != null
            try{
                rs.close();
            }catch(SQLException sqle1){}
        if(pstmt != null
            try{
                pstmt.close();
            }catch(SQLException sqle2){}
        if(conn != null
            try{
                conn.close();
            }catch(SQLException sqle3){}
    }
    return dto;
}
 
cs


회원 정보를 수정하는 화면을 만든다. 

 regForm.jsp를 복사해서 다른 부분만 수정하면 된다.

/WebContent/memberone/modifyForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!-- 정보수정 폼 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="memberone.*" %>
<jsp:useBean id="dao" class="memberone.MemberDao"/>
<%
    String loginID = (String)session.getAttribute("loginID");
    MemberDto dto = dao.getMember(loginID);
%>
<!doctype html>
<html>
<head>
<title>Modify Form</title>
<link href="css/style.css" rel="stylesheet" type="text/css"/>
<link href="css/regFormstyle.css" rel="stylesheet" type="text/css"/>
<script src="script.js"></script>
</head>
<body>
<section>
<form method="post" action="modifyProc.jsp" name="regForm">
<table class="regtable">
    <tr>
        <th colspan="2">회원 수정 정보 입력</th>
    </tr>
    <tr>
        <td>아이디 : </td>
        <td><%= dto.getId() %></td>
    </tr>
    <tr>
        <td>패스워드 : </td>
        <td><input type="password" name="pass" 
                                    value="<%=dto.getPass()%>" required/></td>
    </tr>
    
    <tr>
        <td>패스워드 확인 : </td>
        <td><input type="password" name="repass" 
                                    value="<%=dto.getPass()%>" required/></td>
    </tr>
    <tr>
        <td>이메일 : </td>
        <td><input type="email" name="email" 
                                    value="<%= dto.getEmail()%>" required/></td>
    </tr>
    <tr>
        <td colspan="2" class="regsubmit">
        <input type="button" value="정보 수정" 
                                        onclick="updateCheck()"/>&nbsp;&nbsp;
        <input type="button" value="취소"
                                        onclick="javascript:window.location='main.jsp'"/>
        </td>
    </tr>
</table>
</form>
</section>
</body>
</html>
 
cs


실행결과

로그인 후 정보수정 클릭하면 updateCheck함수가 없으므로 아무런 동작은 하지 않는다.

회원의 정보가 잘 출력되는지 확인만 한다.



이제 로그인한 후 수정화면에서 취소를 누르면 login.jsp로 보내고 정보수정일 경우 updateCheck()함수를 호출하도록script.js파일에 updateCheck()함수 추가. 아이디와 이름은 제외하고 값을 체크하도록 동작한다.

/WebContent/memberone/script.js 파일에 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function updateCheck(){
    if(document.regForm.pass.value==""){
        alert("비밀번호를 입력해 주세요.");
        document.regForm.pass.focus();
        return;
    }
    if(document.regForm.repass.value==""){
        alert("비밀번호를 확인해 주세요.");
        document.regForm.repass.focus();
        return;
    }
    if(document.regForm.pass.value != document.regForm.repass.value){
        alert("비밀번호가 일치하지 않습니다.");
        document.regForm.repass.focus();
        return;
    }
    if(document.regForm.email.value==""){
        alert("이메일을 입력해 주세요.");
        document.regForm.email.focus();
        return;
    }
    
    var str=document.regForm.email.value;
    var atPos = str.indexOf('@');
    var atLastPos = str.lastIndexOf('@');
    var dotPos = str.indexOf('.');
    var spacePos = str.indexOf(' ');
    var commaPos = str.indexOf(',');
    var eMailSize = str.length;
    if(        atPos > 1 && 
            atPos == atLastPos && 
            dotPos > 3 && 
            spacePos == -1 && 
            commaPos == -1 && 
            atPos + 1 < dotPos && 
            dotPos + 1 < eMailSize
        );
    else{
        alert('E-mail주소 형식이 잘못 되었습니다.\n\r다시 입력해 주세요!');
        document.regForm.email.focus();
        return;
    }
    document.regForm.submit();
}
cs


이제 정보 수정을 처리할 기능을 구현한다.

정보수정 버튼을 누르면 데이터베이스에 업데이트를 수행하도록 MemberDao에 메서드 추가

/src/memberone/MemberDao.java에 메서드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void memberUpdate(MemberDto dto){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try{
            conn = getConnection();
            pstmt = conn.prepareStatement(
                    "update MEMBER set PASS=?, EMAIL=? where ID=?");
            pstmt.setString(1, dto.getPass());
            pstmt.setString(2, dto.getEmail());
            pstmt.setString(3, dto.getId());
            pstmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(pstmt != null
                try{
                    pstmt.close();
                }catch(SQLException sqle2){}
            if(conn != null
                try{
                    conn.close();
                }catch(SQLException sqle3){}
        }
        
}
cs


이어서 memberUpdate() 메서드를 사용하여 정보수정을 처리할 jsp페이지를 작성한다.

/WebContent/memberone/modifyProc.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="memberone.*" %>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="dao" class="memberone.MemberDao"/>
<jsp:useBean id="dto" class="memberone.MemberDto"/>
<jsp:setProperty property="*" name="dto"/>
<%
    String loginID = (String)session.getAttribute("loginID");
    dto.setId(loginID);
    dao.memberUpdate(dto);
%>
<!doctype html>
<html>
<head>
<title>Update Process</title>
<meta http-equiv="Refresh" content="3;url=main.jsp">
<link href="css/style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<article>
<font size="3" face="바탕체">
<b>회원정보가 수정 되었습니다.</b><br/><br/>
3초 후에 로그인 페이지로 이동합니다.
</font>
</article>
</body>
</html>
cs


정보수정 테스트!

 


 수정 후 “정보수정” 클릭

 


수정이 잘 된다면 다음으로 회원 탈퇴기능을 구현한다. 

4. 회원탈퇴 구현

회원 탈퇴를 누르면 비밀번호를 다시 확인하도록 하고 맞으면 탈퇴가 가능하도록 구현할 것이다.

그래서 비밀번호를 입력받는 페이지부터 구성한다.

/WebContent/memberone/deleteForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!doctype html>
<html>
<head>
<title>회원 탈퇴</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
<style>
.deleteTable{
    margin: auto;
    left:0; top:0; right:0; bottom:0;
    margin-bottom:5px;
    width: 260px; 
    border: 1px solid black; 
    text-align:center; 
}
</style>
</head>
<script>
function checkIt(){
    if(!document.myForm.pass.value){
        alert("비밀번호를 입력하지 않았습니다.");
        document.myForm.pass.focus();
        return false;
    }
}
</script>
 
<body>
<form name="myForm" method="post"  action="deleteProc.jsp" 
                onsubmit="return checkIt()">
    <table class="deleteTable">
        <tr><td colspan="2"><b>회원 탈퇴</b></td></tr>
        <tr><td><b>비밀번호 입력</b></td>
            <td><input type="password" name="pass"></td>
        </tr>
        </table>
        <input type="submit" value="회원탈퇴">
        <input type="button" value="취소" 
            onClick="javascript:window.location='main.jsp'">
</form>
</body>
</html>
cs


작성 후 동작 확인

취소를 누르면 로그인 페이지로 이동되고 회원탈퇴 버튼의 기능은 현재 없는 상태다.

 

이어서 회원삭제 작업을 처리할 메서드를 DAO에 추가한다.

/src/memberone/MemberDao.java에 메서드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public int deleteMember(String id, String pass){
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String dbPass = ""//데이터베이스에 실제 저장된 비밀번호
    int result = -1;
    try{
        conn = getConnection();
        pstmt = conn.prepareStatement("select PASS from MEMBER where ID=?");
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
        if(rs.next()){
            dbPass = rs.getString("pass");
            if(dbPass.equals(pass)){ // true면 본인 확인 성공
                pstmt.close();
                pstmt = conn.prepareStatement(
                        "delete from MEMBER where ID=?");
                pstmt.setString(1, id);
                pstmt.executeUpdate();
                result = 1//회원 탈퇴 성공
            }else{    //본인 확인 실패 - 비밀번호 오류
                result = 0;
            }
        }
    }catch(Exception e){
        e.printStackTrace();
        System.out.println("Exception :  " + e);
    }finally{
        if(rs != null
            try{rs.close();}catch(SQLException sqle1){}
        if(pstmt != null
            try{pstmt.close();}catch(SQLException sqle2){}
        if(conn != null
            try{conn.close();}catch(SQLException sqle3){}
    }
    return result;
}
cs


이제 삭제에 성공이면 1, 실패면 0이 반환된다.

이 값을 가지고 결과를 처리해 줄 deleteProc.jsp를 작성하자.

/WebContent/memberone/deleteProc.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="memberone.*" %>
<jsp:useBean id="dao" class="memberone.MemberDao"/>
<!doctype html>
<html>
<head>
<title>회원탈퇴</title>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<%
    String id = (String)session.getAttribute("loginID");
    String pass = request.getParameter("pass");
    int check = dao.deleteMember(id, pass);
    if(check == 1){
        session.invalidate();
%>
<meta http-equiv="Refresh" content="3;url=login.jsp">
 
<body>
<p>회원정보가 삭제되었습니다.<br></p>
<p>3초 후에 로그인 페이지로 이동합니다.</p>
<%    }
    else{
%>
<script>
    alert("비밀번호가 맞지 않습니다.");
    history.go(-1);
</script>
<%    } %>
</body>
</html>
cs

회원 탈퇴까지 기능구현이 완료되었다면 가입부터 수정 탈퇴까지 기능이 잘 동작하는지 확인한다.

데이터베이스의 내용도 잘 반영이 되는지 확인한다.

문제가 있는 부분은 동작 하나하나 찾아가서 수정하고 확인하고 적용시킨다.

회원 정보 삭제 성공 시 다음과 같은 화면이 보여진다.  


회원가입부터 로그인, 로그아웃 및 회원정보 관련 기능들의 동작 흐름을 이해하자.


반응형

+ Recent posts