Session

dev_hnbm·2023년 12월 20일
0

대덕인재개발원

목록 보기
26/30

💡 Session

세션(Session)은 사용자가 웹 사이트에 접속하여 브라우저를 닫을 때까지의 일련의 상호 작용을 나타낸다. 세션은 사용자가 웹 사이트에 접속할 때 시작되고, 사용자가 브라우저를 닫거나 일정 시간 동안 활동이 없을 때 종료된다.
이를 통해 사용자는 로그인한 상태를 유지하거나 쇼핑 카트에 물품을 추가하는 등의 작업을 수행할 수 있다. 세션은 주로 서버 측에서 관리되며, 각 세션에는 고유한 식별자가 부여되어 해당 세션과 관련된 정보를 식별할 수 있다.

세션 정보 저장하기

JSP 문서에서 세션은 'session' 변수에 이미 저장되어 있다.

  1. 세션 객체를 생성하거나 현재 세션 가져오기
    Request객체.getSession(); 또는 Request객체.getSession(true);
    현재 세션 존재시 현재 세션을 반환하고, 존재하지 않으면 새로운 세션을 생성 후 반환한다.
    Request객체.getSession(false);
    현재 세션 존재시 현재 세션을 반환하고, 존재하지 않으면 null을 반환한다.
  2. 세션에 데이터값 저장하기
    Session객체.setAttribute("key값", 데이터값);
    key값은 String 타입이며 데이터값은 자바의 모든 자료형을 사용할 수 있다.

세션 정보 읽어오기

1. 세션 객체 구하기
2. 데이터 읽기
1개의 데이터를 읽을시 Session객체.getAttribute("key값");
모든 데이터를 읽을시 Session객체.getAttributeNames();
모든 데이터를 읽었을 때 반환값 자료형은 Enumeration 객체다.

세션 정보 출력하기

  • 세션 ID: getId(), 세션을 구분하기 위한 고유한 값이며 이 값이 Cookie에 저장되어 사용됨
  • 세션 생성 시간: getCreationTime()
  • 세션 최근 접근 시간: getLastAccessedTime()
  • 세션 유효 시간: getMaxInactiveInterval() (초단위)

세션 삭제하기

1. 세션 객체 구하기
2. 세션 삭제하기
개별 세션 데이터 삭제시 Session객체.removeAttribute("삭제할 key값");
모든 세션 데이터 삭제시 Session객체.invalidate();

예제

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>
	<a href="<%=request.getContextPath()%>/sessionAdd.do">Session 정보 저장하기</a><br><br>
	<a href="<%=request.getContextPath()%>/sessionRead.do">Session 정보 확인하기</a><br><br>
	<a href="<%=request.getContextPath()%>/sessionDelete.do">Session 정보 삭제하기</a>
</body>
</html>

SessionAdd.do

package kr.or.ddit.session;

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("/sessionAdd.do")
public class SessionAdd extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");

		HttpSession session = request.getSession();
		session.setAttribute("testSession", "연습용 세션");
		session.setAttribute("userName", "홍길동");
		session.setAttribute("age", 30);
		
		PrintWriter out = response.getWriter();
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Session 연습</title></head>");
		out.println("<body>");
		out.println("<h2>Session 데이터가 저장되었습니다.</h2><br><br>");
		out.println("<a href='" + request.getContextPath() + "/basic/session/sessionTest01.jsp'>시작 문서로 이동하기</a>");
		out.println("</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

SessionRead.do

package kr.or.ddit.session;

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("/sessionRead.do")
public class SessionRead extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		HttpSession session = request.getSession();
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Session 연습</title></head>");
		out.println("<body>");
		out.println("<h2>저장된 Session 데이터 확인하기</h2><hr>");
		out.println("<h3>세션 데이터 1개 확인하기</h3>");
		
		String sessionValue = (String)session.getAttribute("testSession");
		if(sessionValue == null) out.println("<h3>'testSession'의 세션값이 없습니다.</h3>");
		else out.println("<h3>testSession의 세션 값: " + sessionValue + "</h3>");
		
		out.println("<hr>");
		
		out.println("<h3>전체 세션 데이터 확인하기</h3>");
		out.println("<ul>");
		
		Enumeration<String> sessionKeys = session.getAttributeNames();

		int cnt = 0;
		while(sessionKeys.hasMoreElements()) {
			cnt++;
			String key = sessionKeys.nextElement();
			out.println("<li>" + key + ": " + session.getAttribute(key) + "</li>");
		}
		
		if(cnt == 0) out.println("<li>세션 데이터가 하나도 없습니다.</li>");
		
		out.println("</ul>");
		out.println("<hr>");		
		
		out.println("<h3>세션 관련 정보 출력하기</h3>");
		out.println("세션 ID: " + session.getId() + "<br>");
		out.println("세션 생성 시간: " + session.getCreationTime() + "<br>");
		out.println("세션 최근 접근 시간: " + session.getLastAccessedTime() + "<br>");
		out.println("세션 유효 시간: " + session.getMaxInactiveInterval() + "<br><br>");
		
		out.println("<a href='" + request.getContextPath() + "/basic/session/sessionTest01.jsp'>시작 문서로 이동하기</a>");
		out.println("</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

SessionDelete.do

package kr.or.ddit.session;

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("/sessionDelete.do")
public class SessionDelete extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		HttpSession session = request.getSession();
		
		// 개별 삭제
		// session.removeAttribute("testSession");
		
		// 세션 자체 삭제
		session.invalidate();
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Session 연습</title></head>");
		out.println("<body>");

		out.println("<h2>Session 삭제하기</h2><br><br><hr>");
		out.println("<a href='" + request.getContextPath() + "/basic/session/sessionTest01.jsp'>시작 문서로 이동하기</a>");

		out.println("</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

과제


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>
<%
String userId = (String)session.getAttribute("loginUser");
%>
<body>
<%
if(userId == null) {
%>
  <form action="<%=request.getContextPath() %>/sessionLogin.do" method="post">
    <table border="1" style="margin: 0 auto;">
      <tr>
        <td>ID: </td>
        <td><input type="text" name="id" placeholder="ID를 입력하세요.">
	  </tr>
	  <tr>
		<td>PASS: </td>
		<td><input type="password" name="pw" placeholder="PASSWORD를 입력하세요.">
	  </tr>
	  <tr>
		<td colspan="2" style="text-align: center;">
		  <input type="submit" value="Login">
		</td>
	  </tr>
	</table>
  </form>
<%
} else {
%>
  <h3><%=userId %>님 반갑습니다.</h3><br>
  <a href="<%=request.getContextPath() %>/sessionLogout.do">로그아웃</a>
<%
}
%>
</body>
</html>

sessionLogin.do

package kr.or.ddit.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
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("/sessionLogin.do")
public class SessionLogin extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		HttpSession session = request.getSession();

		if("admin".equals(id) && "1234".equals(pw)) {
			session.setAttribute("loginUser", id);
		}
		response.sendRedirect(request.getContextPath() + "/basic/session/sessionLogin.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

sessionLogout.do

package kr.or.ddit.session;

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("/sessionLogout.do")
public class SessionLogout extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.invalidate();
		
		response.sendRedirect(request.getContextPath() + "/basic/session/sessionLogin.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

0개의 댓글