Web Session

Session(세션)

세션이란?

  • 일정 시간동안 같은 브라우저로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술 즉, 웹 브라우저를 통해 웹 서버에 접속한 이후로 브라우저를 종료할 때 까지 유지되는 상태 클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는 데 이것이 세션ID다.

  • 세션 사용 사례 (로그인 정보 유지)

1. html

<a href="hello">hello Servlet</a><br>
<a href="loginId">loginId Servlet</a>

2. helloServlet

package sample09;

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("/hello") // 경로 설정
public class HelloServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html; charset=utf-8");
		
		PrintWriter pw = resp.getWriter();
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		pw.println("<body>");

		HttpSession session = req.getSession(false);  
		/*
		 	getSession(false)
		 	session Object가 존재하면, 현재 HttpSession을 반환한다.
		 	존재하지 않으면 , null을 반환
		 	
		 	getSession(true)
		 	session Object가 존재하면, 현재 HttpSession을 반환한다.
		 	존재하지 않으면 , 새로 생성한다.
		 */
		if(session == null) {
			session = req.getSession(true);
			session.setMaxInactiveInterval(30);//365*24*60*60 1년 세션 저장 기간
			session.setAttribute("visited", "1"); // 첫세션 임의 생성
			pw.println("<p>첫번째 방문입니다.</p>");
			
		}else {
			String visited = (String)session.getAttribute("visited");
			int count = Integer.parseInt(visited);  // 이미 생성된 visited 세션이 있으면 카운트하여 방문횟수 표기
			
			count++;
			
			pw.println("<p>방문회수는"+count+"번째 방문입니다.</p>");
			session.setAttribute("visited", count+"");
		}
		
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
	}
}

3. LoginServlet

package sample09;

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

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("/loginId")
public class LoginIdServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html; charset=utf-8");
		
		PrintWriter pw = resp.getWriter();
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		pw.println("<body>");
		
		pw.println("<h3>login id session</h3>");
		
		HttpSession session = null;	//항상 먼저 오브젝트부터 잡아놓아야한다.
		if(session == null) {
			pw.println("<p>session을 등록합니다</p>");
			session = req.getSession(true); 
			
			session.setAttribute("id", "abc123");
			session.setAttribute("name", "홍길동");
			session.setAttribute("visited", "1");
		}
		
		/*  //위에서 생성한 세션을 아래의 방식으로 출력 가능
		 * String id = (String)session.getAttribute("id"); 
		 * String name =(String)session.getAttribute("name");
		 * pw.println("<p>id:"+id+"</p>");
		 * pw.println("<p>name:"+name+"</p>");
		 */
		//여러개의 세션 출력시 아래 방법 사용
		Enumeration<String> enum_session = session.getAttributeNames();
		
		while(enum_session.hasMoreElements()) {
			String key = enum_session.nextElement();
			String value = (String)session.getAttribute(key);
			pw.println("<p>"+key+":"+value+"</p>");
		}
		
		pw.println("<a href=delobj>name 삭제</a>");
		pw.println("<a href=sessionDel>session 삭제</a>");
		
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
	}
}

세션 삭제

1. key 삭제(obj삭제)

package sample09;

import java.io.IOException;
import java.util.Enumeration;

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("/delobj")
public class DeleteObject extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		
		session.removeAttribute("name");	// 세션은 살아있고 안에있는 속성만 지운것
		Enumeration<String> enum_session = session.getAttributeNames();
		
		while(enum_session.hasMoreElements()) {
			String key = enum_session.nextElement();
			String value = (String)session.getAttribute(key);
			System.out.println("<p>"+key+":"+value+"</p>");
		}
	}
}

2. Session 삭제

package sample09;

import java.io.IOException;

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("/sessionDel")
public class SessionDelete extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		
		session.invalidate(); // delete(삭제), release(해방)
		if(req.getSession(false)==null) {
			System.out.println("session이 비어 있습니다.");
		}
	}
}