[국비학원 기록/JSP] 세션(Session), 데이터베이스(DB) 연동 로그인 구현
my code archive
article thumbnail
반응형
세션(Session)

1. 세션

1)클라이언트가 서버에 접속해있는 동안 그 상태를 유지하는 것이 목적임.

 

2)웹 브라우저를 통해 서버 접속 => 처리 => 웹 브라우저를 닫아 서버와의

  접속을 종료하는 하나의 단위를 세션이라고 한다.

 

3)HTTP는 기본적으로 일회성 연결 -> 웹 클라이언트 하나하나를 기억할 수 없다.

   개인화된 서비스를 제공하려면 웹 클라이언트를 웹 서버에서 인식하고 있어야 한다.

   =>웹 클라이언트가 '내가 누구다'라는 데이터를 요청마다 실어보내야 한다.

 

2. 세션 설정 확인

Dynamic Web Project 생성 시
Generate web.xml deployment descriptor 체크

web.xml에
세션 유효 시간 설정

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 import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");        //날짜 표현 형식
    long creationTime = session.getCreationTime();                        //세션 생성(최초 요청) 시각
    String creationTimeStr =  dateFormat.format(new Date(creationTime));
    long lastTime = session.getLastAccessedTime();                        //마지막 요청 시각
    String lastTimeStr = dateFormat.format(new Date(lastTime));
%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Session</title>
</head>
<body>
    <h2>Session 설정 확인</h2>
    <ul>
        <li>세션 유지 시간 : <%=session.getMaxInactiveInterval() %></li>
        <li>세션 아이디 : <%=session.getId() %></li>
        <li>최초 요청 시각 : <%=creationTimeStr%></li>
        <li>마지막 요청 시각 : <%=lastTimeStr %></li>
    </ul>
</body>
</html>
cs

3. 쿠키 vs 세션

  쿠키 세션
저장 위치, 형식 클라이언트 PC에 text로 저장 웹 서버에 Object 타입으로 저장
보안 보안에 취약 보안에 안전
속도 세션보다 빠름 서버 자원 사용하므로 쿠키보다 느림
용량 용량 제한 O 서버가 허용하는 한 제약 없음
유지 시간 쿠키 생성 시 설정,
설정된 시간 경과 시 무조건 삭제
web.xml에서 설정,
설정된 시간 내 동작 있다면 유지됨.

 

4. 세션과 DB를 이용한 로그인 구현

 

1)로그인 페이지 작성

LoginForm.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Session</title>
</head>
<body>
    <h2>로그인 페이지</h2>
    <span style="color: red; font-size: 1.2em;">
        <%=request.getAttribute("LoginErrMsg") == null? "" : request.getAttribute("LoginErrMsg") %>
    </span>
    
    <%
        if(session.getAttribute("UserId")==null){        //로그인 상태 확인 => 값이 null이면 저장되지 않은 것
                                                        //               => 로그아웃 상태를 뜻함
    %>
        <script type="text/javascript">
            function validateForm(form) {
                if(!form.user_id.value){
                    alert("아이디를 입력하세요.");
                    return false;
                }
                if(form.user_pw.value==""){
                    alert("패스워드를 입력하세요.");
                    return false;
                }
            }
        </script>
        
        <form action="LoginProcess.jsp" method="post" name="LoginFrm" onsubmit="return validateForm(this)">
            아이디 : <input type="text" name="user_id"><br>
            비밀번호 : <input type="password" name="user_pw"><br>
            <input type="submit" value="로그인하기"> 
        </form>
    <%
        }else{                                            //로그인된 상태
    %>
            <%=session.getAttribute("UserName") %> 회원님, 로그인하셨습니다.<br>
            <a href="Logout.jsp">[로그아웃]</a>
    <%
        }
    %>
</body>
</html>
cs

 

2) Member 테이블 생성

 

3)DB 연동
-JDBCConnection, MemberDAO, MemberDTO
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import javax.servlet.ServletContext;
 
public class JDBCConnection {
 
    public Connection con;
    public PreparedStatement pstmt;
    public ResultSet rs;    //select 쿼리문의 결과를 저장할 때 사용됨
    
    public JDBCConnection() {
        try {
            //JDBC 드라이버 로드
            Class.forName("oracle.jdbc.driver.OracleDriver");
            
            //DB에 연결
            String url = "jdbc:oracle:thin:@localhost:1521:XE";
            String id = "wdsql";
            String pwd = "0311";
            con = DriverManager.getConnection(url, id, pwd);
            
            System.out.println("DB 연결 성공");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public JDBCConnection(String driver, String url, String id, String pwd) {
    
        try {
            //JDBC 드라이버 로드
            Class.forName(driver);
            //DB에 연결
            con=DriverManager.getConnection(url, id, pwd);
            
            System.out.println("DB 연결 성공 - 매개변수 생성자");
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public JDBCConnection(ServletContext application) {
        try {
            //JDBC 드라이버 로드
            String driver = application.getInitParameter("OracleDriver");
            Class.forName(driver);
            
            //DB에 연결
            String url = application.getInitParameter("OracleURL");
            String id = application.getInitParameter("OracleId");
            String pwd = application.getInitParameter("OraclePwd");
            con = DriverManager.getConnection(url, id, pwd);
            
            System.out.println("DB 연결 성공 - 매개변수 생성자2");
            
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    //연결 해제(자원 반납)
    public void close() {
        try {
            if(rs != null)
                rs.close();
            if(con != null)
                con.close();
            if(pstmt != null)
                pstmt.close();
            
            System.out.println("JDBC 자원 해제");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

DTO (Data Transfer Object)
-데이터를 교환하기 위해 생성하는 객체
-멤버 변수, getter/setter 메서드만 갖춤.
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
public class MemberDTO {
    
    //멤버변수
    private String id;
    private String pass;
    private String name;
    private String regidate;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRegidate() {
        return regidate;
    }
    public void setRegidate(String regidate) {
        this.regidate = regidate;
    }
 
}
cs
DAO (Data Access Object)
-데이터베이스의 데이터에 접근하기 위한 객체
-JDBC 통해 구현함
-테이블에서 수행할 수 있는 CRUD 전담함.
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
import java.sql.SQLException;
 
import kr.co.ezenac.common.JDBCConnection;
 
public class MemberDAO extends JDBCConnection{
 
    //명시된 DB로의 연결 완료된 MemberDAO 객체 생성
    public MemberDAO(String drv, String url, String id, String pw) {
        super(drv, url, id, pw);        //부모 클래스의 매개변수 4개짜리 생성자 호출
    }
    
    public MemberDTO getMember(String uid, String upass) {
        MemberDTO dto = new MemberDTO();
        String query = "SELECT * FROM MEMBER WHERE ID = ? AND PASS = ?";
        
        try {
            pstmt = con.prepareStatement(query);
            pstmt.setString(1, uid);        //쿼리문의 첫 번째 파라미터 값 설정
            pstmt.setString(2, upass);        //쿼리문의 두 번째 파라미터 값 설정
            rs=pstmt.executeQuery();        //쿼리문 실행
            
            //결과 처리
            if(rs.next()) {
                //쿼리 결과로 얻은 회원 정보를 DTO 객체에 저장
                dto.setId(rs.getString("id"));
                dto.setPass(rs.getString("pass"));
                dto.setName(rs.getString(3));
                dto.setRegidate(rs.getString(4));    
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
                
        return dto;            //dto 객체 반환
    }
}
cs
LoginProcess.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
<%@page import="kr.co.ezenac.membership.MemberDTO"%>
<%@page import="kr.co.ezenac.membership.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%
    //로그인 폼으로부터 받은 아이디와 패스워드
    String userId = request.getParameter("user_id");
    String userPwd = request.getParameter("user_pw");
    
    //web.xml에서 가져온 데이터베이스 연결 정보
    String OracleDriver = application.getInitParameter("OracleDriver");
    String OracleURL = application.getInitParameter("OracleURL");
    String OracleId = application.getInitParameter("OracleId");
    String OraclePwd = application.getInitParameter("OraclePwd");
    
    MemberDAO dao = new MemberDAO(OracleDriver, OracleURL, OracleId, OraclePwd);
    MemberDTO memberDTO = dao.getMember(userId, userPwd);
    dao.close();
    
    if(memberDTO.getId() != null){
        //로그인 성공
        session.setAttribute("UserId", memberDTO.getId());
        session.setAttribute("UserName", memberDTO.getName());
        response.sendRedirect("LoginForm.jsp");
    }else{
        //로그인 실패
        request.setAttribute("LoginErrMsg""로그인 오류입니다.");
        request.getRequestDispatcher("LoginForm.jsp").forward(request, response);
    }
%>
cs

커넥션풀 사용하지 않고 web.xml에 접속 정보 설정하는 방법도 있다.

Logout.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
 
//방법1 : 회원 인증 정보 속성 삭제
/* session.removeAttribute("UserId");
session.removeAttribute("UserName"); */
 
//방법2 : 모든 속성 한꺼번에 삭제
 
session.invalidate();
 
//속성 삭제 후 페이지 이동
response.sendRedirect("LoginForm.jsp");
 
%>
cs
<실행 화면>

LoginForm.jsp 실행

null값이면 아이디 입력 메세지 출력

아이디 일치하지 않을 경우

일치할 경우

로그아웃을 누르면 로그인 페이지로 돌아옴

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형