-
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"); %>