1. 세션의 개요
세션(session)
클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법
•예를 들면 웹 쇼핑몰에서 장바구니나 주문 처리와 같은 회원 전용 페이지의 경우 로그인 인증을 통해 사용 권한을 부여
•다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지되므로 회원 전용 페이지를 계속 사용할 수 있음
•이렇게 사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것
웹 서버에서만 접근이 가능하므로 보안 유지에 유리하며 데이터를 저장하는 데 한계가 없음
오직 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하므로 웹 서버의 서비스를 제공받는 사용자를 구분하는 단위가 됨
(즉, 크롬, Microsoft Edge, 웨일 등 각 웹브라우저의 세션 아이디가 다르다. 하지만 같은 크롬안에서는 세션 아이디가 동일하다)
웹 브라우저를 닫기 전까지 웹 페이지를 이동하더라도 사용자의 정보가 웹 서버에 보관되어 있어 사용자 정보를 잃지 않음
세션과 쿠키는 CLIENT와 SERVER 간의 상태를 유지시켜주는 방법
세션과 쿠키 모두 SERVER에서 생성
세션은 SERVER에 존재하고, 쿠키는 CLIENT(의 쿠키저장소)에 존재함


2. 세션 생성
세션 생성
session 내장 객체의 setAttribute( ) 메소드를 사용
setAttribute( ) 메소드를 이용하여 세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있음
만약 동일한 세션의 속성 이름으로 세션을 생성하면 마지막에 설정한 것이 세션 속성 값이 됨

첫 번째 매개변수 name은 세션으로 사용할 세션 속성 이름을 나타내며, 세션에 저장된 특정 값을 찾아오기 위한 키로 사용
두 번째 매개변수 value는 세션의 속성 값
•세션 속성 값은 Object 객체 타입만 가능하기 때문에 int, double, char 등의 기본 타입은 사용할 수 없음

예제 [세션 생성하기]
session01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<!-- 아이디, 비밀번호, submit버튼(전송)
요청URI : session01_process.jsp
요청파라미터 : {id=admin&passwd=java}
요청방식 : post
-->
<form action="session_priocess.jsp" method="post">
<p>아 이 디 : <input type="text" name="id" placeholder="아이디"/></p>
<p>비밀번호 : <input type="text" name="passwd" placeholder="비밀번호"/></p>
<p><input type="submit" value="전송"/></p>
</form>
</body>
</html>
session_priocess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<!-- 아이디, 비밀번호, submit버튼(전송)
요청URI : session01_process.jsp
요청파라미터 : {id=admin&passwd=java}
요청방식 : post
-->
<%
request.setCharacterEncoding("UTF-8");
String userId = request.getParameter("id");
String userPw = request.getParameter("passwd");
out.print("userId : " + userId + ", userPw : " + userPw);
/*
* 세션을 사용하려면 세션을 생성해야 함
1) 세션 생성 :
JSP 내장 객체인 session.setAttribute(String name, Object value);
세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있음.
만약, 동일한 세션의 속성 이름으로 세션을 생성하면 마지막에 설정한 것이 세션 속성 값이 됨
2) 세션 설명 :
String name : 세션으로 사용할 세션 속성 이름. 세션에 저장된 특정 값(value)
을 찾아오기 위한 키로 사용 됨.
Object value : 세션 속성의 값. Object 객체 타입만 가능하므로
int, double, char 등의 기본 타입은 사용할 수 없음
*/
if(userId.equals("admin") && userPw.equals("java")) {
session.setAttribute("userId", userId);
session.setAttribute("userPw", userPw);
out.print("세션 설정이 성공했습니다.<br>");
out.print(userId+"님 환영합니다.");
//pageScope(대전) -동일jsp
pageContext.setAttribute("userId", userId);
//requestScope(대한민국) - 동일요청내
request.setAttribute("userId", userId);
//applicationScope(지구) - 웹브라우저 내
application.setAttribute("userId", userId);
}else {
out.print("세션 설정이 실패했습니다.");
}
%>
<hr />
</body>
</html>
3. 세션 정보
단일 세션 정보 얻기
세션에 저장된 하나의 세션 속성 이름에 대한 속성 값을 얻어오려면 getAttribute( ) 메소드를 사용
getAttribute( ) 메소드는 반환 유형이 Object 형이므로 반드시 형 변환을 하여 사용해야 함

첫 번째 매개변수 name은 세션에 저장된 세션 속성 이름
•해당 속성 이름이 없는 경우 null을 반환

다중 세션 정보 얻기


예제 [ 단일 : 세션에 저장된 속성값 가져와 출력하기]
session02.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<title>Sesion</title>
<script type="text/javascript">
//버튼을 누르면 삭제
$(function(){
//<button type="button" id="btnDel">userId 세션 삭제</button>
$("#btnDel").on("click", function(){
location.href="/ch13/session04.jsp"
})
//<button type="button" id="btnadd">userId 세션 추가</button>
$("#btnadd").on("click", function(){
location.href="/ch13/session04Add.jsp"
})
//<button type="button" id="btnDelAll">모든 세션 속성 이름 삭제</button>
$("#btnDelAll").on("click", function(){
location.href="/ch13/session04DelAll.jsp"
})
})
</script>
</head>
<body>
<%
//session.setAttribute("userId", userId);
//session.setAttribute("userpw", userpw);
//생성된 세션의 정보를 가져오기
/*
1. getAttribute() : 단일 세션 정보 얻기
Object getAttribute(Sreing name)
2. getAttributeNames() : 다중 세션 정보 얻기
세션에 저장된 여러개의 세션 속성 이름을 열거형으로 반환
*/
if(request.isRequestedSessionIdValid()==true){
out.print("세션이 유효합니다.");
}else {
out.print("세션이 유효하지 않습니다.");
}
// (String 타입으로 cast)반환 유형이 Object
String userId = (String)session.getAttribute("userId"); // admin
// cast연산자를 통해서 String 타입으로 형변환
String userpw = (String)session.getAttribute("userPw");// javas
//다른 jsp 페이지 이므로 null
String userId2 = (String)pageContext.getAttribute("userId");
//session01_process.jsp와 다른 새로운 session2.jsp요청이므로 null
String userId3 = (String)request.getAttribute("userId");
//웹 브라우저 내에서 데이터가 공유되므로 admin
String userId4 = (String)application.getAttribute("userId");
%>
<p>설정된 세션의 속성 값 [1] : <%=userId %></p>
<p>설정된 세션의 속성 값 [2] : <%=userpw %></p>
<p>설정된 pageContext의 속성 값 [3] : <%=userId2 %></p>
<p>설정된 request의 속성 값 [4] : <%=userId3 %></p>
<p>설정된 application의 속성 값 [5] : <%=userId4 %></p>
<hr />
<%
String name ="";
String value = "";
//세션에 저장된 모든 세션 속성 이름을 리턴
Enumeration en = session.getAttributeNames();
int i=0;
//세션 속성 이름이 있을 때 까지 반복
while ( en.hasMoreElements() ){
name = en.nextElement().toString();
value = session.getAttribute(name).toString();
out.print("설정된 세션 속성 명 [" + i + "] : " + name + "<br />");
out.print("설정된 세션 속성 값 [" + i + "] : " + value + "<br />");
out.print("<hr />");
i++;
}
%>
<button type="button" id="btnDel">userId 세션 삭제</button>
<button type="button" id="btnadd">userId 세션 추가</button>
<button type="button" id="btnDelAll">모든 세션 속성 이름 삭제</button>
</body>
</html>
4. 세션 삭제
단일 세션 삭제하기


다중 세션 삭제하기
세션에 저장된 모든 세션 속성 이름을 삭제하려면 invalidate( ) 메소드를 사용


예제 [세션에 저장된 세션정보 삭세하기]
session04.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>userId라는 session객체의 속성명</title>
</head>
<body>
<%
//세션에 저장된 세션 속성 이름 userId를 삭제
session.removeAttribute("userId");
//userId가 삭제된 결과를 확인
response.sendRedirect("/ch13/session02.jsp");
%>
</body>
</html>
예제 [세션에 저장된 세션정보 다시 추가하기]
session04Add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<%
//세션에 저장된 세션 속성 이름 userId를 삭제
session.setAttribute("userId","admin");
//userId가 삭제된 결과를 확인
response.sendRedirect("/ch13/session02.jsp");
%>
</body>
</html>
예제 [세션에 저장된 모든 세션정보 삭제하기]
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>userId라는 session객체의 속성명</title>
</head>
<body>
<%
/*
다중 세션 삭제
invalidate() 메소드 : 세션에 저장된 모든 세션 속성 이름을 삭제
return 값은 없음(void)
*/
session.invalidate();
application.removeAttribute("userId");
//userId가 삭제된 결과를 확인
response.sendRedirect("/ch13/session02.jsp");
%>
</body>
</html>
5. 세션 유효 시간 설정
세션 유효 시간


예제 [세션 유효시간을 가져와 출력하기]
session07.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>session</title>
</head>
<body>
<h4>------ 세션 유효 시간 변경 전 ------</h4>
<%
/*
세션 유효 시간 : 세션을 유지하기 위한 세션의 일정 시간
웹 브라우저(크롬)에 마지막 접근한 시간부터 일정시간 이내에 다시 웹 브라우저에
접근하지 않으면 자동으로 세션이 종료됨
세션 유효시간 설정 void setMaxInactiveInterval(int interval) : 초단위
파라미터 interval : 기본값이 1800초(30분).
만약, 0 또는 음수로 설종 시 세션 유효시간이 없게됨(비추천)
session.invalidate()를 통해서 세션을 없애주지 않으면
세션이 계속 메모리에 남아 메모리 부족 현상이 발생하게됨
*/
//세션에 설정된 유효시간 (기본 1800초 30분)
int time = session.getMaxInactiveInterval();
%>
<p>세션 유효 시간 : <%=time%>초</p>
<h4>------ 세션 유효 시간 변경 후 ------</h4>
<%
session.setMaxInactiveInterval(60*60); // 3600초 => 1시간
time = session.getMaxInactiveInterval();
%>
<p>세션 유효 시간 : <%=time%>초</p>
</body>
</html>
session08.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<%
//java.util.Date
Date time = new Date();
//간단날짜형식. java.text.SimpleDateFormat
SimpleDateFormat format =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 고유한 세션 내장 객체의 아이디
String sessionId = session.getId();
//세션이 생성된 시간
//1970년 1월 1일 이후 흘러간 시간을 의미, 단위는 1/1000초
long start_time = session.getCreationTime();
//세션에 마지막으로 접근한 시간 (1/1000초)
//1970년 1월 1일 이후 흘러간 시간을 의미, 단위는 1/1000초
long last_time = session.getLastAccessedTime();
//웹 사이트에 머문 시간
long userTime = (last_time - start_time);
%>
<p>세션 아이디 : <%=sessionId %></p>
<p>요청 시작 시간 : <%=format.format(start_time) %></p>
<p>요청 마지막 시간 : <%=format.format(last_time) %></p>
<p>웹 사이트의 경과 시간 : <%=userTime/(1000*60)%>분</p>
</body>
</html>
참고 자료
'JSP 웹 프로그래밍 > 수업내용' 카테고리의 다른 글
| [JSP 웹 프로그래밍] 쿠키(cookie) (0) | 2024.07.18 |
|---|---|
| [JSP 웹 프로그래밍] 필터(filter) (0) | 2024.07.15 |
| [JSP 웹 프로그래밍] 예외처리 (0) | 2024.07.12 |
| [JSP 웹 프로그래밍] 예외처리 (0) | 2024.07.12 |
| [JSP 웹 프로그래밍] 시큐리티 (0) | 2024.07.10 |