1. 세션이란?
클라이언트가 웹 브라우저를 통해 서버에 접속한 후, 용무를 처리하고, 웹 브라우저를 닫아 서버와의 접속을 종료하는 하나의 단위를 세션이라고 한다.
세션은 웹 브라우저를 실행할 때마다 새롭게 생성된다. 설정된 유지 시간 동안 유지되며, 유지 시간이 만료되기 전에 새로운 요청이 들어오면 수명이 계속 연장된다.
(예 - 은행 사이트는 보통 10분의 로그인을 유지하며 활동이 없으면 자동 로그아웃)
유지 시간 이전이라도 웹 브라우저를 닫으면 세션는 종료 된다.(탭 종료는 유지 됨)
2. 세션 설정, 확인, 삭제
1) 유지 시간 설정 방법 2가지
- /WEB-INF/web.xml 에서 설정법
<!-- 세션 유지 시간 설정(20분으로 설정) -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
-JSP 파일에서 session 내장 객체가 제공하는 setMaxInactiveInterval()을 사용
<%
session.setMaxInactiveInterval(1800); //1800초로 설정, 30분
%>
2) 세션 확인법
<%@ 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));
%>
<html>
<head><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>
3) 세션 삭제
세션은 웹 브라우저를 닫으면 종료되지만, 웹 브라우저 설정에서 모든 쿠키를 삭제해 세션을 삭제할 수도 있다.
3. 세션과 DB를 이용한 로그인 구현
1) 로그인 페이지 구현
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head><title>Session</title></head>
<body>
<jsp:include page="../Common/Link.jsp" />
<h2>로그인 페이지</h2>
<span style="color: red; font-size: 1.2em;">
<%= request.getAttribute("LoginErrMsg") == null ?
"" : request.getAttribute("LoginErrMsg") %>
</span>
<%
if (session.getAttribute("UserId") == null) { // 로그인 상태 확인
// 로그아웃 상태
%>
<script>
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>
2) DB 연동
데이터를 주고 받기 위해서는 DTO 클래스와 테이블에 접근하기 위한 DAO 클래스를 만들어야 한다.
- DTO(Data Transfer Object)
계층 사이에서 데이터를 교환하기 위해 생성하는 객체.
별도의 로직 없이 속성(멤버 변수)와 그 속성을 접근하기 위한 게터/세터 메서드만 갖춘 객체.
- DAO(Data Access Object)
데이터베이스의 데이터를 접근하기 위한 객체. 보통 JDBC를 통해 구현하며, 하나의 테이블에서 수행할 수 있는 CRUD를 전담. (CRUD - 생성, 읽기, 갱신, 삭제)
--DTO 클래스 (DB와 동일하게 생성) --
package membership;
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;
}
}
--DAO 클래스 --
package membership;
import common.JDBConnect;
public class MemberDAO extends JDBConnect {
// 명시한 데이터베이스로의 연결이 완료된 MemberDAO 객체를 생성합니다.
public MemberDAO(String drv, String url, String id, String pw) {
super(drv, url, id, pw);
}
// 명시한 아이디/패스워드와 일치하는 회원 정보를 반환합니다.
public MemberDTO getMemberDTO(String uid, String upass) {
MemberDTO dto = new MemberDTO(); // 회원 정보 DTO 객체 생성
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; // DTO 객체 반환
}
}
댓글 없음:
댓글 쓰기