본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet 세션 : 장바구니 페이지 만들기

728x90
반응형

 

01 세션의 개요

세션(session)은 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법을 말한다. 예를 들면 웺 ㅛ핑몰에서 장바구니나 주문 처리와 같은 회원 전용 페이지의 경우 로그인 인증을 통해 사용 권한을 부여한다. 그래서 다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지되므로 회원 전용 페이지를 계속 사용할 수 있다. 이렇게 사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것이 세션이다.

 

세션은 웹 서버에서만 접근이 가능하므로 보안 유지에 유리하며 데이터를 저장하는 데 한계가 없다. 세션은 오직 웹 서버에 존재하는 객체로 웹 브라우저 마다 하나씩 존재하므로 웹 서버의 서비스를 제공받는 사용자를 구분하는 단위가 된다. 이러한 세션을 사용하면 클라이언트가 웹 서버의 세션에 의해 가상으로 연결된 상태가 된다. 따라서 웹 브라우저를 닫기 전까지 웹 페이지를 이동하더라도 사용자의 정보가 웹 서버에 보관되어 있어 사용자 정보를 잃지 않습니다. 

 

이와같이 Jsp 페이지는 세션 기능을 사용할 수 있도록 session 내장 객체를 제공한다. session 내장 객체는 다음과 같은 메소드를 지원한다.

 

session 내장 객체 메소드의 종류

 

메소드 반환 유형 설명
getAtrribute(String name) java.lang.Object 세션 속성 이름이 name 인속성값을 Object 형으로 반환한다.
해당되는 속성 이름이 없을 때는 null을 반환한다. 반환 값이 Object 형이므로 반드시 형 반환을 하여 사용해야 한다. 
getAttributeNames() java.util.Enumeration 세션 속성 이름을 Enumeration 객체 타입으로 반환한다. 
getCreationTime() long 세션이 생성된 시간을 반호나한다. 1970년1월1일0시0초부터 현재 세션이 생성된 시간까지 경과한 시간을 1/1,000초 값으로 반환한다.
getId() java.lang.String 세션에 할당된 교유 아이디를 String 형으로 반환한다.
getLastAccessedTime() long 해당 세션에 클라이언트가 마지막으로 request 를 보낸 시간을 반환한다. 
getMaxInactiveInterval
(int interval)
int 해당 세션을 유지하기 위해 세션 유지 시간을 반환한다. 기본 값은 1,800초(30분) 이다.
isNew() boolean 해당 세션의 생성 여부를 반환한다. 처음 생성된 세션이면 true를 반환하고 이전에 생성된 세션이면 false를 반환한다.
removeAttribute(String name) void 세션 속성 이름이 name인 속성을 제거한다.
setAttribute(String name,Object value) void 세션 속성 이름이 name 인 속성에 value를 할당한다. 
setMaxInactiveInterval(int interval) void 해당 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정한다.
invaildate()   현재 세션에 저장된 모든 세션 속성을 제거한다. 

 

 

02 세션생성

세션을 사용하려면 먼저 세션을 생성해야 한다. 세션 생성은 session 내장 객체의 setAttribute()메소드를 사용하며 형식은 다음과 같다. setAttribute()메소드를 이용하여 세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있다. 만약 동일한 세션의 속성 이름으로 세션을 ㅓ생성하면 마지막에 설정한 것이 세션 속성 값이 된다. 

 

void setAttribute(String name, Object value)

 

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

 

다음은 세션 속성 이름을 memberId, 세션 속성 값을 admin 으로 세션을 생성하는 예이다. 

[setAttribute() 메소드 사용 예]

session.setAttribute("memberId" , "admin");

 

예제 - 세션 생성하기

 

session01.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Session</title>
</head>
<body>

	<form action="session01_process.jsp" method="post">
		<p> ID : <input type="text" name="id">
		<p> PASSWORD : <input type="text" name="passwd">
		<p> <input type="submit" value="submit">
	</form>

</body>
</html>

 

 

session01_process.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Session</title>
</head>
<body>

	<%
	
		//요청 파라미터 아이디와 비밀번호를 전송받도록 request 내장 객체의 getParameter()메소드를 작성한다.
		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>

 

 

NOTE_ 세션을 생성하는 또다른 방법

1.request.getSession()을 이용한 세션 생성: HttpSession 을 생성하는 또 다른 방법은 request 기본 객체의 getSession()메소드를 사용하는 것이다. request.getSession()메소드는 현재 요청과 관련된 session 내장 객체를 반호나한다. 

<%@ page session="false" %>
<%
	HttpSession httpSession = reuqest.getSession();
    List list = (List)httpSession.getAttribute("list");
    list.add(productId);

%>

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

 

2. <%@ page session="true"%> 를 이용한 세션 생성 : page 디렉티브 태그 내 session 속성의 기본값이 true 이므로 session 속성의 값을 false 로 지정하지 않으면 세션이 생성된다. 일단 세션이 생성되면 session 내장 객체를 통해 세션을 사용할 수 있다. 

 

 

03 세션 정보

 

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

 

3.1 단일 세션 정보 얻기

세션에 저장된 하나의 세션 속성 이름에 대한 속성 값을 얻어오려면 getAttribute()

메소드를 사용하며 형식은 다음과 같다. getAttribute()메소드는 반환 유형이 Object  형이므로 반드시 형 변환을 하여 사용해야 한다. 

Object getAttribute(String name)

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

 

다음은 세션에 저장된 세션 속성 이름이 memberId 인 세션 속성 값을 얻어오는 예이다. getAttribute() 메소드는 반환 유형이 Object 형 이므로, 세션 속성 이름 memberId 값이 String 형의 admin 이라면 cast 연산자인 (String)을 사용하여 형 반환을 해야한다. 만약 세션에memberId 라는 속성 이름이 저장되어 있지 않으면 null을 반환한다. 

 

[getAttribute() 메소드 사용 예]

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

 

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

 

session02.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Session</title>
</head>
<body>

	<%
	
		//세션에 저장된 세션 속성 이름 userID, userPW 의 속성 값을 가져오도록 
		//session 내장 객체의 getAttribute()메소드를 작성한다. 
		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 객체 타입이므로 모든 세션 정보를 얻어오는데 유용하다. Enumeration 객체를 사용하려면 JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 java.util.Enumeration 을 설정해야 한다. 

 

 

Enumeration getAttributeNames();

 

다음은 세션에 저장된 모든 세션 속성 이름과 속성 값을 얻어오는 예이다. 

 

[getAttributeNames() 메소드 사용 예]

Enumeration enum = session.getAttributeNames();

while(enum.hasMoreElements()){
	String name = enum.nestElement().toString();
    String value = session.getAttribute(name).toString();
}

 

 

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

 

session03.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
<title>Session</title>
</head>
<body>

	<%
	
		String name;
		String value;
		
		
		//세션에 저장된 모든 세션 속성 이름을 가져오도록 session 내장 객체의 getAttributeNames()메소드를 작성
		Enumeration en = session.getAttributeNames();
		int i = 0;
		
		
		//Enumeration 객체의 hasMoreElements()메소드를 통해 저장된 세션 속성 이름이 있을 떄 까지 반복하도록 while 문을 작성
		while(en.hasMoreElements()){
			i++;
			name = en.nextElement().toString();//세션 속성 이름을 가져오도록 Enumeration 객체의 nextElement()메소드를 작성
			value = session.getAttribute(name).toString();//세션 속성 이름의 속성 값을 가져오도록 session 내장 객체의 getAttribute()메소드를 작성. 
			
			
			//세션 속성 이름과 속성 값을 출력하도록 작성. 
			out.println("설정된 세션의 속성 이름 [" + i + " ] :" + name + "<br>");
			out.println("설정된 세션의 속성 값 [" + i + "] : " + value + "<br>");
			
		}
	
	%>

</body>
</html>

 

 

04  세션 삭제

 

생성된 세션을 더 유지할 필요가 없으면 session 내장 객체의 removeAttribute()또는 invalidate()메소드를 사용하여 삭제한다. 세션이 삭제되면 현재 사용중인 session 내장 객체가 삭제되므로 session 내장 객체에 저장된 모든 속성도 함께 삭제된다. 

 

4.1 단일 세션 삭제하기

세션에 저장된 하나의 세션 속성 이름을 삭제하려면 removeAttribute()메소드를 사용하며 형식은 다음과 같다.

 

void removeAttribute(String name)

 

여기서 매개변수 name 은 세션에 저장된 세션 속성의 이름이다. 

다음은 세션에 저장된 세션 속성 이름 memberId 인 세션을 삭제하면 계속 유지되었던 세션의 속성 이름 memberId는 더이상 사용할 수 없다. 

 

[removeAttribute() 메소드 사용 예]

session.removeAttribute("memberId");

 

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

 

session04.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
<title>Session</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>");
		
		
		//세션에 저장된 세션 속성 이름 userID 를 삭제하도록 session 내장 객체의 removeAttribute() 메소드를 작성. 
		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>
728x90
반응형