romworld

JSP 26 - 세션(session) 본문

WEB/JSP

JSP 26 - 세션(session)

inderrom 2023. 1. 17. 12:45

세션(session)

  • 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법
  • 예) 웹 쇼핑몰 장바구니나 주문 처리와 같은 회원 전용 페이지의 경우 로그인 인증을 통해 사용 권한을 부여
  • 다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지됨
  • 오직 웹 서버에 존재하는 객체

 

session 내장 객체 주요 메소드

  • setAttribute()
  • getAttrubute()
  • invalidate()

session 꺼내기

 

<session01.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
<!--
후보키(Candidate key) : Not Null, No Duplicate
기본키(Primary Key) : 후보키 중에 대표적인 속성을 1개 선택(Not Null, No Duplicate)
대체키(Alternate key) : 후보키 중에 기본키가 안된 속성들
외래키(Foreign key) : 부모테이블의 기본키가 자식테이블의 외래키로 전이(copy)됨.
					자식테이블의 외래키는 부모테이블의 기본키를 참조(reference)함
복합키(Composite key) : 테이블에 후보키가 없을 때 2개 이상의 속성을 하나로 묶어 후보키 및 기본키로 설정
 -->
	<!-- 폼 페이지 
	요청 URL : session01_process.jsp
	요청 파라미터 : {"id":"a001","passwd":"java"}
	-->
	<form action="session01_process.jsp" method="post">
		<!-- 폼 데이터 
		required : 필수(madatory) -> Not null
		-->
		<p>아이디 : <input type="text" name="id" required /></p>
		<p>비밀번호 : <input type="text" name="passwd" required/></p>
		<p><input type="submit" value="전송" /></p>
	</form>
</body>
</html>

<session01_process.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
<!-- 폼 페이지 
	요청 URL : session01_process.jsp
	요청 파라미터 : {"id":"a001","passwd":"java"}
	-->
<%	
	// 요청 파라미터타입은 String
	String user_id = request.getParameter("id"); //a001
	String user_pw = request.getParameter("passwd"); //java
	
	//JSP에는 sesssion 기본 내장 객체가 있음(scope은 session영역)
	if(user_id.equals("admin") && user_pw.equals("1234")){ // 관리자인지?
			// jsp에서 session 쓰는 방법
			session.setAttribute("userID", user_id);
			session.setAttribute("userPW", user_pw);
			
			// application 내장 객체. 웹브라우저에서 정보 공유
			application.setAttribute("userID", user_id);
			application.setAttribute("userPW", user_pw);
		
			/*
			// request 기본 객체의 getSession() 메소드를 사용하여 session 객체 생성 가능
			// 서블릿에서 session 쓰는 방법.
			HttpSession httpSession = request.getSession();
			httpSession.setAttribute("userID", user_id);
			httpSession.setAttribute("userPW", user_pw);
			*/
			
			out.print("<h2>세션 설정이 성공했습니다.</h2>");
			out.print("<h5>" + user_id + "님 환영합니다.</h5>");
		
	}else{ // 관리자가 아니면...
		out.print("<h2>세션 설정이 실패했습니다.</h2>");
	}
%>
<p><a href="session02.jsp">세션 정보 확인하기</a></p>
</body>
</html>

 

 

<sesson02.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
<%
	//session.setAttribute("userID","admin");
	//session.setAttribute("userPW","1234");
	
	// session은 동일한 웹브라우저 내에서 정보가 공유됨
	// getAttribute()메소드의 리턴타입은 Object
	String user_id = (String)session.getAttribute("userID");
	String user_pw = (String)session.getAttribute("userPW");
	
	// application 내장 객체. 웹브라우저에서 정보 공유됨
	// getAttribute() 메소드의 리턴타입은 Object
	String user_id2 = (String)application.getAttribute("userID");
	String user_pw2 = (String)application.getAttribute("userPW");

	
	out.print("<p>설정된 세션의 속성 값 [1] : " + user_id +"</p>");
	out.print("<p>설정된 세션의 속성 값 [2] : " + user_pw +"</p>");
	out.print("<hr />");
	out.print("<p>설정된 세션의 속성 값 [2] : " + user_id2 +"</p>");
	out.print("<p>설정된 세션의 속성 값 [2] : " + user_pw2 +"</p>");
%>
</body>
</html>

실행


  • session과 application의 차이점은
  • session은 동일한 웹브라우저만 가능하지만 (크롬->크롬)
  • application은 브라우저가 달라도 정보가 공유된다. (크롬->웨일)

다중 session 꺼내기

 

<%
	/* 다중 세션 정보 얻기
	- session.getAttributeNames()
	- 세션에 저장된 여러 개의 세션 속성 이름들을 Enumeration 객체 타입으로 리턴해줌
	*/
	Enumeration en = session.getAttributeNames();

	out.print("<p>en : " + en + "</p>");
	
	//session.setAttribute("userID", user_id);
	//session.setAttribute("userPW", user_pw);
	out.print("<p>en : " + en.nextElement().toString() + "</p>");
	out.print("<p>en : " + en.nextElement().toString() + "</p>");
	
%>

 

session id,pw를 꺼내온다 데이터를&nbsp; 하나 더 꺼낼 올 경우 설정해둔 게 없기 때문에 500 에러가 나온다

 

<session03.jsp>

다중 값을 꺼낼 경우 hasMoreElements()로 꺼내온다.

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
<%
	/* 다중 세션 정보 얻기
	- session.getAttributeNames()
	- 세션에 저장된 여러 개의 세션 속성 이름들을 Enumeration 객체 타입으로 리턴해줌
	*/
	Enumeration en = session.getAttributeNames();
	
	String name = "";
	String value = "";

	out.print("<p>en : " + en + "</p>");
	
	//session.setAttribute("userID", user_id);
	//session.setAttribute("userPW", user_pw);
	// en.hasMoreElements() : 세션 속성 이름이 있을 때까지만 반복
	while(en.hasMoreElements()){
		// 세션 속성 이름
		name = en.nextElement().toString();
		out.print("<p>name : " + name + "</p>");
		// 그 속성 이름에 매핑되어 있는 값
		value = (String)session.getAttribute(name);
		//value = session.getAttribute(name).toString(); 이렇게 써도 됨
		out.print("<p>value : " + value + "</p>");
	}
	
%>
</body>
</html>

 


session 속성 추가

 

<session01_process.jsp>

	session.setAttribute("userHP", "010-1234-5678");

 

session 삭제

  • session.removeAttribute()

 

 

<session04.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
<!-- session01.jsp와 session01_process.jsp를 먼저 수행 후 -->
   <!-- 
      session.setAttribute("userID", user_id);   //admin
      session.setAttribute("userPW", user_pw);   //java
      session.setAttribute("userHP", "010-1234-5678"); 010-123-1234
    -->
    <!-- P.430 -->
    <h4>-----세션 삭제 전-----</h4>
    <%//스크립틀릿
       String user_id = (String)session.getAttribute("userID");   //admin
       String user_pw = (String)session.getAttribute("userPW");   //java
       String user_hp = (String)session.getAttribute("userHP");   //java
       out.print("설정된 세션 이름 userID : " + user_id + "<br />");   //admin
       out.print("설정된 세션 이름 userPW : " + user_pw + "<br />");   //java
       out.print("설정된 세션 이름 userHP : " + user_hp + "<br />");   //010-123-1234
       //잘 안씀
       session.removeAttribute("userHP");
    %>
    <h4>-----세션 삭제 후-----</h4>
    <%//스크립틀릿
       user_id = (String)session.getAttribute("userID");   //null
       user_pw = (String)session.getAttribute("userPW");   //java
       user_hp = (String)session.getAttribute("userHP");   //java
       out.print("설정된 세션 이름 userID : " + user_id + "<br />");   //null
       out.print("설정된 세션 이름 userPW : " + user_pw + "<br />");   //java
       out.print("설정된 세션 이름 userHP : " + user_hp + "<br />");   //010-123-1234
    %>	
</body>
</html>

 

Enumeration을 이용해서 한번에 꺼내오기

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
	<!-- session01.jsp와 session01_process.jsp를 먼저 수행 후 -->
	 <h4>-----세션 삭제 전-----</h4>
	 <%//스크립틀릿
	 	String name = "";
	 	String value = "";
	 
	 	Enumeration en = session.getAttributeNames();	//userID, userPW, userHP
	 
	 	while(en.hasMoreElements()){
	 		name  = en.nextElement().toString();
	 		value = session.getAttribute(name).toString();
	 		out.print("설정된 세션 이름 " + name + " : " + value + "<br />");	//
	 	}
	 	//잘 안씀
// 	 	session.removeAttribute("userHP");
	 	//******
	 	//로그아웃 : 세션의 모든 속성명 제거
	 	session.invalidate();
	 %>
	 <h4>-----세션 삭제 후-----</h4>
	 <%//스크립틀릿
	 	en = session.getAttributeNames();
	 
	 	while(en.hasMoreElements()){
	 		name  = en.nextElement().toString();
	 		value = session.getAttribute(name).toString();
	 		out.print("설정된 세션 이름 " + name + " : " + value + "<br />");	//
	 	}
	 %>
</body>
</html>

 


모든 세션 삭제하기

 

  • session.invalidate()

 

 

** 5초 뒤에 다시 session01.jsp로 보내기 setTimeout()

 

 


session 유효 시간

  • 기본 시간은 30분으로 설정되어 있음
  • session.getMaxInactiveInterval() 으로 설정한다.

 

<session07.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
	<h4>------------ 세션 유효 시간 변경 전 -----------</h4>
	<%
		// 세션에 설정된 유효 시간 (기본 1800초(30분))
		int time = session.getMaxInactiveInterval();  // 초단위
		
		out.print("<p>세션 유효 시간 : " + time + "초</p>");
	%>
		<h4>------------ 세션 유효 시간 변경 후 -----------</h4>	
	<%
		// 세션 유효 시간을 60x60(3600초 : 1시간)으로 설정
		session.setMaxInactiveInterval(60*60);  // 3600초
		time = session.getMaxInactiveInterval();
		
		out.print("<p>세션 유효 시간 : " + time + "초</p>");
	%>
</body>
</html>


  • session.getId() 
  • session.getLastAccessedTime();
  • session.getCreationTime()

 

세션은 웹브라우저마다 주소가 다르다 (서로 공유가 다름)

<session08.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Session</title>
</head>
<body>
	<%
		String session_id = session.getId();
		// 새로고침할 때마다 변함
		long last_time = session.getLastAccessedTime();
		// 세션이 생성된 시간은 새로고침 해도 변하지 않음
		// 웹브라우저 모두 닫고 다시 열어야 변함
		long start_time = session.getCreationTime();
//		 1970년 1월 1일 0시 0분 0초부터 현재 세션이 생성딘 시간까지 경과한 시간을
//		 1/1000초 값으로 반환
//		start_time = start_time * 1000;//초
		long used_time = (last_time - start_time)/6000;
	
	
	%>
	<p>세션 아이디 : <%=session_id %></p>
	<p>요청 마지막 시간 : <%=last_time %></p>
	<p>요청 시작 시간 : <%=start_time %></p>
	<p>웹 사이트에 머문 시간 : <%=used_time %></p>
</body>
</html>

 

Comments