위로 아래

세션

// session 생성
HttpSession session = request.getSession();

// session 설정
session.setAttribute("key",value);

// session 불러오기
session.getAttribute("key");
  1. 쿠키와 달리 클라이언트의 PC가 아니라 서버의 메모리에 생성되어 정보를 저장. 보안성이 좋다.
  2. 클라이언트가 웹 브라우저를 통해 서버에 접속한 후, 용무를 처리하고, 웹 브라우저를 닫아 서버와 접속을 종료하는 하나의 단위
  3. 클라이언트가 서버에 접속해있는 동안 그 상태를 유지하는 것이 목적 (다른 페이지에 가도 로그인이 끊기지 않는 것은 세션 때문)
  4. 오직 웹 서버에 존재하는 객체.
  5. 브라우저마다 하나씩 존재 (다른 브라우저 쓰면 세션 다시 생성)
  6. 로그인은 쿠키보다는 세션을 이용해서 만드는 게 좋다
  쿠키 세션
저장 위치 / 형식 클라이언트 PC에 text로 저장 웹 서버에 Object 타입으로 저장
보안 클라이언트에 저장되므로 보안에 취약 서버에 저장되므로 보안에 안전
자원 / 속도 서버 자원을 사용하지 않으므로 세션보다 빠름 서버 자원을 사용하므로 쿠키보다 느림
용량 용량의 제한이 있음 서버가 허용하는 한 제한 X
유지 시간 쿠키 생성 시 설정. 설정 시간이 경과되면 무조건 삭제 서버의 web.xml에서 설정. 설정된 시간 내라도 동작이 있다면 삭제되지 않고 유지

 

 

 


session 내장객체 메소드 목록

  1. setAttribute(이름, 값) : 세션 생성
  2. getAttribute(이름) : 해당 속성 값을 Object형으로 반환. 해당되는 속성 이름이 없을 때는 null을 반환. (Object 형을 반환하므로 반드시 형 변환과 동시에 사용해서 형을 지정해주어야 한다.)
  3. getAttributeNames() : 세션 속성 이름들은 Enumeration 객체 타입으로 반환
  4. getCreationTime() : 세션이 생성된 시간을 반환 (1970년 1월 1일 0시 0초부터 세서, 1/1000초 값으로 반환)
  5. getId() : 세션에 할당된 고유 아이디를 String 타입으로 반환
  6. getLastAccessedTime() : 해당 세션에 클라이언트가 마지막으로 request를 보낸 시간을 반환
  7. getMaxInactiveInterval (숫자) : 해당 세션을 유지하기 위해 세션 유지 시간을 반환. 기본값 1800(3초)
  8. isNew() : 해당 세션의 생성 여부 반환. 처음 생성이면 true, 이전에 생성된 세션이면 false
  9. removeAttribute(이름) : 해당 속성을 제거
  10. setAttribute(이름, 값) : 해당 속성에 해당 값을 할당.
  11. setMaxInactiveInterval(숫자) : 해당 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정
  12. Invalidate() : 현재 세션에 저장된 모든 세션 속성을 제거

 

 

 


예시

더보기
package ch09.sec03.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/sess")
public class SessionTest extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		out.println("세션 아이디 : " + session.getId() + "<br>");
		out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
		out.println("최초 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		if(session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		}
		
	}
}

새로고침 후

 

 

세션 생성 예시

더보기
<!-- 로그인 페이지 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="Session01Process.jsp" method="post">
		<p>아 이 디 : <input type="text" name="id"></p>
		<p>비밀번호 : <input type="text" name="passwd"></p>
		<p><input type="submit" value="전송"></p>
	</form>
</body>
</html>
<!-- 로그인 처리 페이지 Session01Process.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>

 

세션 값 확인 예시

더보기
<!-- 세션 확인하는 페이지 Session02.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 = (String) session.getAttribute("userID");
	String user_pw = (String) session.getAttribute("userPW");
	
	out.println("설정된 세션의 속성값 [1] : " + user_id + "<br>");
	out.println("설정된 세션의 속성값 [2] : " + user_pw + "<br>");
%>
</body>
</html>
<!-- 세션의 속성과 이름을 다 받아오는 Session03.jsp 파일 -->
<%@ page import ="java.util.Enumeration" %>
<%@ 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 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>

 

세션 삭제 예시

더보기
<!-- 세션 값 삭제 removeAttribute() 페이지 Session04.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>
<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>
<!-- 세션 값 삭제 전, 후 정보를 다 불러오는 페이지 Session05.jsp -->
<%@page import="java.util.Enumeration"%>
<%@ 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 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>");	
}
%>
<h4>--- 세션을 삭제한 후 ---</h4>
<%
	en = session.getAttributeNames();
	i = 0;
	
	while(en.hasMoreElements()){
		name = en.nextElement().toString();
		value = (String)session.getAttribute(name).toString();
		out.println("설정된 세션 이름 [" + i + "]" + name + "<br>");
		out.println("설정된 세션 값 [" + i + "]" + value + "<br>");	
	}
%>

</body>
</html>
<!-- 세션이 유효한지 확인하는 페이지 Session06.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>
<h4>--- 세션을 삭제하기 전 ---</h4>
<%
	String user_id = (String) session.getAttribute("userID");
	String user_pw = (String) session.getAttribute("userPW");
	
	out.println("설정된 세션 이름 : " + user_id + "<br>");
	out.println("설정된 세션 값 : " + user_pw + "<br>");	

	if(request.isRequestedSessionIdValid() == true){
		out.print("세션이 유효합니다.");
	} else{
		out.print("세션이 유효하지 않습니다.");
	}
	session.invalidate();
%>
<h4>--- 세션을 삭제한 후 ---</h4>
<%
	if(request.isRequestedSessionIdValid() == true){
		out.print("세션이 유효합니다.");
	} else{
		out.print("세션이 유효하지 않습니다.");
	}
%>
</body>
</html>

 

세션 유효 시간 예시

더보기
<!-- 세션 유효 시간 변경 페이지 session07.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>
	<h4>--- 세션 유효시간 변경 전 ---</h4>
	<%
		int time = session.getMaxInactiveInterval()/60;
		out.println("세션 유효 시간 : " + time + "분<br>");
	%>
	<h4>--- 세션 유효시간 변경 후 ---</h4>
	<%
		session.setMaxInactiveInterval(60*1);
		time = session.getMaxInactiveInterval()/60;
		
		out.println("세션 유효 시간 : " + time + "분<br>");	%>
</body>
</html>
<!-- session08.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 session_id = session.getId();
	long last_time = session.getLastAccessedTime();
	long start_time = session.getCreationTime();
	long used_time = (last_time - start_time)/(1000*60);
	
	out.println("세션 아이디" + session_id + "<br>");
	out.println("요청 시작 시간" + start_time + "<br>");
	out.println("요청 마지막 시간" + last_time + "<br>");
	out.println("웹 사이트의 경과 시간" + used_time + "<br>");
	%>
</body>
</html>

 

동시 접속자 수 예시

더보기
<!-- Login2.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 name="frmLogin" method="post" action="../login11111" encType="UTF-8">
		아이디 : <input type="text" name="user_id"><br>
		비밀번호 : <input type="password" name="user_pw"><br>
		<input type="submit" value="로그인">
		<input type="reset" value="다시 입력">
	</form>
</body>
</html>
// LoginTest 서블릿
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/login11111")
public class LoginTest extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession();
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println(session.isNew());
		
		LoginImpl loginUser = new LoginImpl(user_id, user_pw);
		if(session.isNew()){
			session.setAttribute("loginUser", loginUser);
		}
		
		out.println("<head><script type='text/javascript'>setTimeout('history.go(0);', 5000)</script></head>");
		out.println("<html><body>아이디는 " + loginUser.user_id + "<br>");
		out.println("총 접속자수는 " + LoginImpl.total_user + "<br></body></html>");
	}
}
// LoginImpl 클래스
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class LoginImpl implements HttpSessionBindingListener {
	String user_id;
	String user_pw;
	static int total_user=0;
	public LoginImpl() {}
	
	public LoginImpl(String user_id, String user_pw) {
		this.user_id = user_id;
		this.user_pw = user_pw;		
	}
	
	@Override
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("사용자 접속");
		++total_user;
	}
	
	@Override
	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("사용자 접속 해제");
		total_user--;
	}
}