ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 18. Session
    카테고리 없음 2021. 12. 9. 21:18

    1. 세션이란?
        1) 클라이언트가 서버에 접속해 있는 동안 그 상태를 유지하는 것이 목적임
        2) 웹 브라우저 통해 서버 접속 -> 용무 처리 -> 웹 브라우저를 닫아 서버와의 접속을 종료하는 하나의 단위를 세션이라 함

    2. 세션 설정 확인

    3. 세션과 DB를 이용한 로그인 구현
        1) 로그인 페이지 작성
        2) DB 연동
            - DTO (Data Transfer Object)
                - 데이터를 교환하기 위해 생성하는 객체임
                - 멤버변수, 게터/세터 메서드만 가짐
                - VO (Value Object), 값 객체
            - DAO (Data Access Object)
                - 데이터베이스의 데이터에 접근하기 위한 객체임
                - JDBC를 통해 구현함
                - 테이블에서 수행할 수 있는 CRUD를 전담함

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

     


    <%@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>

     


    //xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
      <display-name>chap11_JSP</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      
      <!-- 세션 유지 시간 설정 (20분) -->
      <session-config>
      	<session-timeout>20</session-timeout>
      </session-config>
      
      <!-- 
      한글 깨짐 방지를 위한 필터 설정
      	<filter>
      		<filter-name>SetCharEncoding</filter-name>
      		<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
      		<init-param>
      			<param-name>encoding</param-name>
      			<param-value>utf-8</param-value>
      		</init-param>
      	</filter>
      	<filter-mapping>
      		<filter-name>SetCharEncoding</filter-name>
      		<url-pattern>/*</url-pattern>
      	</filter-mapping>
       -->
       
       <!-- 오라클 DB 접속 정보 : 초기화 매개변수로 입력 -->
       <context-param>
       	<param-name>OracleDriver</param-name>
       	<param-value>oracle.jdbc.driver.OracleDriver</param-value>
       </context-param>
       <context-param>
       	<param-name>OracleURL</param-name>
       	<param-value>jdbc:oracle:thin:@localhost:1521:XE</param-value>
       </context-param>
       <context-param>
       	<param-name>OracleId</param-name>
       	<param-value>wdsql</param-value>
       </context-param>
       <context-param>
       	<param-name>OraclePwd</param-name>
       	<param-value>0311</param-value>
       </context-param>
    </web-app>
    <%@ 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>
    package kr.co.ezenac.membership;
    
    /*
      	id		varchar2(10)	NOT NULL,
    	pass	varchar2(15)	NOT NULL,
    	name	varchar2(30)	NOT NULL,
    	regidate	DATE		DEFAULT sysdate NOT NULL,
     */
    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;
    	}
    }
    package kr.co.ezenac.membership;
    
    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 {
    			psmt = con.prepareStatement(query);
    			psmt.setString(1, uid);		//쿼리문의 첫 번째 파라미터 값 설정
    			psmt.setString(2, upass);	//쿼리문의 두 번째 파라미터 값 설정
    			rs = psmt.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(Exception e) {
    			e.printStackTrace();
    		}
    		return dto;	//객체 반환
    	}
    }
    package kr.co.ezenac.common;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import javax.servlet.ServletContext;
    
    public class JDBCconnection {
    	public Connection con;
    	public PreparedStatement psmt;
    	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) {
    			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(psmt != null) {psmt.close();}
    			if(con != null) {con.close();}
    			
    			System.out.println("JDBC 자원 해제");
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    <%@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");
    	
    	//회원 테이블에 DAO를 통해 회원 정보가 있는 DTO 정보를 획득
    	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);
    		
    	}
    %>
    <%@ 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");
    %>

    댓글