티스토리 뷰

코딩/JSP

[11주 1일차] 세션

ehzim 2023. 12. 18. 17:57

CHAPTER 13. 세션 : 장바구니 페이지 만들기

 

1. 세션의 개요

세션은 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법을 말한다.

로그인 인증을 통해 사용 권한을 부여하고 다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지된다.

(request와 비슷하지만 차이점 상태 유지)

사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지한다.

 

세션은 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하기 때문에 이용자 수를 구분하는 단위가 될 수 있다.

 

메소드 반환 유형 설명
getAttribute(String name) java.lang.Object 세션 속성 이름이 name인 속성 값을 Object 형으로 반환한다. 해당되는 속성 이름이 없을 때는 null을 반환한다. 반환 값이 Object 형이기 때문에 출력하고자하는 데이터(원래 상태)로 형변환해야한다.
getAttributeNmaes() java.util.Enumeration 세션 속성 이름을 Enumerationo 객체 타입으로 반환한다.
getCreationTime() long 세션이 생성된 시간을 반환한다. 70년 1월 1일 0시 0초부터 현재 세션이 생성된 시간까지 경과한 시간을 1/1,000초 값으로 반환한다. (ms)
getId() java.lang.String 세션에 할당된 고유 아이디(=주민번호)를 String형으로 변환한다. 
getLastAccessedTime() long 해당 세션을 유지하기 위해 세션 유지 시간을 반환한다. 기본 값은 1800초(30분)입니다.
getMaxInactiveInterval(int interval) int 해당 세션을 유지하기 위해 세션 유지 시간을 반환한다. 기본 값은 1800초(30분)이다.
isNew() boolean 해당 세션의 생성 여부를 반환한다. 처음 생성된 세션이면 true를 반환하고 이전에 생성된 세션이면 false를 반환한다.
removeAttribute(String name) void 세션 속성 이름이 name인 속성을 제거한다.
setAttribute(String name, Object value) void 세션 속성 이름이 name인 속성에 value를 할당한다.
setMaxInactiveInterval(int interval) void 해당 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정한다.
Invalidate()   현재 세션에 저장된 모든 세션 속성을 제거한다.

 

 

 

 

 

 

2. 세션 생성

세션을 사용하려면 먼저 세션을 생성해야 한다.

세션 생성은 session 내장 객체의 setAttribute() 메소드를 사용한다.

setAttrivute() 메소드를 이용하여 세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있다.

 

void setAttribute(String name, Object value)

 

* 세션은 request와 같은데 scope 유무만 다르다. 세션은 scope이 없으므로 여러번 계속 유지할 수 있고 request는 scope에 의해 한번으로 끝난다.

 

* 세션 속성 값은 Obejct 객체 타입만 가능하다. 기본 타입을 사용하려면 wrapper사용한다.(자동으로 형변형되긴 한다.)

그리고 Object로 저장되기 때문에 세션에서 값을 가져올때는 우너래의 타입으로 형변환을 해주어야한다.

 

 

 

 

세션 생성하기

예제 13-1

 

session01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="session01_process.jsp" method="post">
		<p> 아이디 : <input type="text" name="id">
		<p> 비밀번호 : <input type="text" name="passwd">
		<p> <input type="submit" value="전송">
	</form>
</body>
</html>

 

 

session01_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String user_id = request.getParameter("id");
		String user_pw = request.getParameter("passwd");
		
		if(user_id.equals("admin")&&user_pw.equals("1234")){
			session.setAttribute("userID", user_id);
			session.setAttribute("userPW", user_pw);
			out.println("세션 설정이 성공했습니다<br>");
			out.println(user_id+"님 환영합니다.");
		}
		else{
			out.println("세션 설정이 실패했습니다.");
		}
	%>
</body>
</html>

 

결과

 

 

- 세션을 생성하는 다른 방법

 

1. request.getSeesion()을 이용한 세션 생성

 

request 기본 객체의 getSession() 메소드를 사용하여 생성할 수 있다.

request.getSession() 메소드는 현재 요청과 관련된 session 내장 객체를 반환한다.

 

request.getSession() 메소드는 세션이 생성되어 있으면 생성된 세션을 반환하고, 생성되어 있지 않으면 새롭게 세션을 생성해서 반환한다.

 

<%@ page session="false" %>
<%
	HrrpSession httpSession = request.getSession();
    List list = (List)httpSession.getAttribute("list");   //형변환
    list.add(productId); 
%>

 

 

2. <%@ page session="true" %> 를 이용한 세션 생성

 

page 디렉티브 태그 내 session 속성의 기본 값이 true 이므로 session 속성의 값을 false로 지정하지 않으면 세션이 생성된다. 세션이 ㅣ생성되면 session 내장 객체를 통해 세션을 사용할 수 있다.

 

<%@ page session="true" %>
<%
	....(생략)....
    session.setAttribute("userInfo", uesrInfo);
    .....(생략)....
%>

 

 

 

 

 

 

 

 

 

3. 세션 정보

 

생성된 세션의 정보를 얻어오려면 session 내장 객체의 getAttribute() 또는 getAttributeNames() 메소드를 사용한다.

 

 

 

 

3-1. 단일 세션 정보 얻기

 

세션에 저장된 하나의 세션 속성 이름에 대한 속성 값을 얻어오려면 getAttribute() 메소드를 사용한다.

getAttribute() 메소드는 반환 타입이 Object 이기 때문에 반드시 형 변환을 해서 사용해야한다.

 

* 저장할 (원래) 타입으로 형변환해야한다.

String id = (String)session.getAttribute("memberId");

 

 

 

 

세션에 저장된 속성 값 가져와 출력하기

예제 13-2

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String user_id = (String) session.getAttribute("userID");
		String user_pw = (String) session.getAttribute("userPW");
		
		out.println("설정된 세션의 속성 값 [1] : "+user_id + "<br>");
		out.println("설정된 세션의 속성 값 [2] : "+user_pw);
	%>
</body>
</html>

 

결과

 

 

 

 

 

 

 

3-2. 다중 세션 정보 얻기

세션에 저장된 여러 개의 속성 값을 얻어오려면 getAttributeNames() 메소드를 사용해야한다.

 getAttributeNames() 메소드는 반환 유형이 Enumeration 객체 타입이기 때문에 가져온 후 저장이나 출력을 하고자 변수에 담을 때 while문을 사용해야한다.

그리고 Enumeration 객체를 사용하려면 page 디렉티브 태그의 import 속성을 이용하여 java.util.Enumeration을 설정해야한다.

 

 

Enumeration enum = session.getAttributeNames();

while(enum.hasMoreElements()){
	String name = enum.nextElement().toString()  //casting문자열로
    String value = session.getAttribute(name).toString(); //체이닝처럼 사용 함수.함수
}

 

 

 

 

 

세션에 저장된 모든 세션 속성 이름과 속성 값 가져와 출력하기

예제 13-3

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String name;
		String value;
		
		Enumeration en = session.getAttributeNames();
		int i =0;
		
		while(en.hasMoreElements()){
			i++;
			name = en.nextElement().toString();
			value = session.getAttribute(name).toString();
			
			out.println("설정된 세션의 속성 이름 ["+i+"] : "+name +"<br>");
			out.println("설정된 세션의 속성 값 ["+i+"] : " +value+"<br>");
		}
	%>
</body>
</html>

 

결과

 

 

 

 

4. 세션 삭제

생성된 세션을 더 유지할 필요가 없으면 내장 객체 중 removeAttribute() 또는 invalidate() 메소드를 사용하여 삭제한다.

세션이 삭제되면 현재 사용 중인 session 내장 객체가 삭제되므로 session 내장 객체에 저장된 모든 속성도 함께 삭제된다.

 

 

 

4-1. 단일 세션 삭제하기  (=key 값 삭제)

세션에 저장된 하나의 세션 속성 이름을 삭제하려면 removeAttribute()메소드를 사용한다.

void removeAtrribute(String name)

 

속성이름 name에 해당하는 세션을 삭제한다.

그리고 삭제된 속성 이름을 더 이상 사용할 수 없다.

 

 

 

 

 

 

세션에 저장된 세션 속성 삭제하기 1

예제 13-4

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>----- 세션을 삭제하기 전-----</h4>
	<%
		String user_id = (String) session.getAttribute("userID");
		String user_pw = (String) session.getAttribute("userPW");
		out.println("설정된 세션 이름 userID : "+user_id+ "<br>");
		out.println("설정된 세션 값 userPW : "+user_pw+"<br>");
	
		session.removeAttribute("userID");
	%>
	<h4>----- 세션을 삭제한 후 -----</h4>
	<%
		user_id = (String) session.getAttribute("userID");
		user_pw = (String) session.getAttribute("userPW");
		out.println("설정된 세션 이름 userID : "+user_id+ "<br>");
		out.println("설정된 세션 값 userPW : "+user_pw+"<br>");
	%>
</body>
</html>

 

결과

 

 

 

 

 

 

세션에 저장된 세션 속성 삭제하기 2

예제 13-5

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>----- 세션을 삭제하기 전 -----</h4>
	<%
		String name;
		String value;
		
		Enumeration en = session.getAttributeNames();
		int i = 0;
		
		while(en.hasMoreElements()){
			i++;
			name = en.nextElement().toString();
			value = session.getAttribute(name).toString();
			out.println("설정된 세션 이름 : "+name+ "<br>");
			out.println("설정된 세션 값 : "+value+ "<br>");
		}
		
		session.removeAttribute("userID");
	%>
	
	<h4>----- 세션을 삭제한 후 -----</h4>
	<%
		en= session.getAttributeNames();
	
		i = 0;
		
		while(en.hasMoreElements()){
			i++;
			name = en.nextElement().toString();
			value = session.getAttribute(name).toString();
			out.println("설정된 세션 이름 : "+name+ "<br>");
			out.println("설정된 세션 값 : "+value+ "<br>");
		}
	%>
</body>
</html>

 

Enumeration 객체를 사용하여 값을 가져왔으므로 while문을 사용하여 출력했다.

 

 

 

 

결과

 

 

 

 

 

 

 

4-2. 다중 세션 삭제하기 (=전체 정보 삭제)

 

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

 

void invalidate()

 

session.invalidate()

 

 

 

 

 

세션에 저장된 모든 세션 속성 삭제하기

예제 13-6

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>----- 세션을 삭제하기 전 -----</h4>
	<%
		String user_id = (String) session.getAttribute("userID");
		String user_pw = (String) session.getAttribute("userPW");
		
		out.println("설정된 세션 이름 userID : " +user_id + "<br>");
		out.println("설정된 세션 값 userPW : " +user_pw + "<br>");
		
		if(request.isRequestedSessionIdValid() == true){
			out.print("세션이 유효합니다.");
		}
		else{
			out.println("세션이 유효하지 않습니다.");
		}
		session.invalidate();
	%>
	<h4>----- 세션을 삭제한 후 -----</h4>
	<%
		if(request.isRequestedSessionIdValid() == true){
			out.print("세션이 유효합니다.");
		}
		else{
			out.println("세션이 유효하지 않습니다.");
		}
	%>
</body>
</html>

 

결과

 

 

 

 

 

 

5. 세션 유효 시간 설정

세션 유효 시간은 세션을 유지하기 위한 세션의 일정 시간을 말한다.

웹 브라우저에 마지막 접근한 시간부터 일정 시간 이내에 다시 웹 브라우저에 접근하지 않으면 자동으로 세션이 종료된다.세션 유효 시간을 설정 하기 위해 session 내장 객체의 setMaxInactiveInterval() 메소드를 사용한다.

 

세션 유효 시간은 기본 값이 1800초 이고 초 단위로 설정된다(ms). 만약 세션 유효 시간을 0이나 음수로 설정하면 세션 유효 시간이 ㅇ벗는 상태가 된다. 이 경우 세션을 삭제했을 때 session.invalidate() 메소드를 호출하지 않으면 생성된 세션 속성이 웹 서버에서 제거되지 않고 유지된다.

세션 유효 시간이 없는 상태에서 session.invalidate() 메소드를 명시적으로 실행하지 않으면 한 번 생성된 세션이 계속 메모리에 남아 있고, 시간이 흐르면 이 세션 때문에 메모리 부족 현상이 발생한다.

 

session.setMaxInactiveInterval(60*60);

 

 

 

세샨 유효 시간을 가져와 출력하기

예제 13-7

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>----- 세션 유효 시간 변경 전 -----</h4>
	<%
		int time = session.getMaxInactiveInterval() / 60;
	
		out.println("세션 유효 시간 : " +time+ "분<br>");
	%>	
	<h4>----- 세션 유효 시간 변경 후 -----</h4>
	<%
		session.setMaxInactiveInterval(60*60);
		time= session.getMaxInactiveInterval() / 60;
		
		out.println("세션 유효 시간 : " +time+ "분<br>");
	%>
</body>
</html>

 

결과

 

 

세션 아이디와 웹 사이트에서 유지한 시간 출력하기

예제 13-8

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String session_id = session.getId();
			
		long last_time = session.getLastAccessedTime();
	
		long start_time = session.getCreationTime();
		
		long used_time = (last_time - start_time) / 60000;
		
		out.println("세션 아이디 : " +session_id + "<br>");
		out.println("요청 시작 시간 : " +start_time+"<br>");
		out.println("요청 마지막 시간 : "+last_time+"<br>");
		out.println("웹 사이트의 경과 시간 : "+used_time+"<br>");
	%>
</body>
</html>

 

결과

 

5분 뒤 실행 결과

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday