티스토리 뷰
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분 뒤 실행 결과
'코딩 > JSP' 카테고리의 다른 글
[쉽게 배우는 JSP 웹 프로그래밍 연습문제] 13장 (+5번 문제 추후 추가) (1) | 2023.12.18 |
---|---|
웹 쇼핑몰 : 장바구니 페이지 만들기 (0) | 2023.12.18 |
[쉽게 배우는 JSP 웹 프로그래밍 연습문제] 3장 (1) | 2023.12.18 |
[쉽게 배우는 JSP 웹 프로그래밍 연습문제] 2장 (1) | 2023.12.17 |
[쉽게 배우는 JSP 웹 프로그래밍 연습문제] 1장 (0) | 2023.12.17 |
- Total
- Today
- Yesterday