JAVA/HIGH JAVA

[JAVA] 세션(HttpSession)

아잠만_ 2024. 6. 3. 10:29
쿠키 (Cookie) 세션 (HttpSession)
클라이언트 쪽에 저장
(웹브라우저에 저장)
서버에 저장
문자열만 저장 객체, 문자, 숫자 등
원하는 자료형으로 저장 가능

세션(HttpSession)

JSP에는 Session객체가 이미 'session'이라는 이름으로 저장되어 있다
  • 아이디
          세션을 구분하기 위한 고유한 값
    session객체.getId();
  • 생성 시간
          1970년 1월 1일부터 경과한 시간 (ms단위)
    session객체.getCreationTime();
  • 가장 최근에 세선에 접근한 시간
         1970년 1월 1일부터 경과한 시간 (ms단위)
    session객체.getLastAccessedTime();
  • 세션 유효시간
          가장 최근에 접근한 시간부터 이 '유효시간'이 경과할 때까지
          세션이 유지된다. (단위 : 초) [기본값은 30분]
    session객체.getMaxInactiveInterval();

저장

  1. Session객체를 생성하거나 현재 Session 가져오기
    • Request객체.getSession(); 또는 Request객체.getSession(true);
      ==> 현재 Session이 존재하면 현재 Session을 반환하고, 
            존재하지 않으면 새로운 Session을 생성하여 반환한다.
    • Request객체.getSession(false);
      ==> 현재 Session이 존재하면 현재 Session을 반환하고, 
            존재하지 않으면 새로운 Session을 생성하지 않고 null을 반환한다
  2. Session에 데이터를 저장하기
    Session객체.setAttribute("key값", 데이터(session값));
           ==> 'key값'은 문자열, '데이터'는 자바의 모든 자료형

읽기

  1. Session 객체를 생성하거나 현재 Session을 가져오기
    HttpSession session = request.getSession();
  2. Session 데이터 읽기
    • 단일 데이터 읽기
      Session객체.getAttribute("key값");
      ==> Object타입이기 때문에 반드시 형변환 필요
    • 모든 데이터 읽기
      ---------------------------------------------------------------------------------
      Enumeration<String> Enumer객체 = Session객체.getAttributeNames();
      while( Enumer객체.hasMoreElements()) {
      String key = Enumer객체.nextElement();
      }
      ----------------------------------------------------------------------------------
      • 키값들을 집합체 형태로 관리
        Enumeration<E>
      • key값을 가져옴
        request객체.getAttributeNames()
      • 다음 집합체가 존재하는지 확인
        Enumer객체.hasMoreElements()
      • 집합체 값 가져오기
        Enumer객체.nextElement();

삭제

  1. Session 객체를 생성하거나 현재 Session을 가져오기
    HttpSession session = request.getSession();
  2. Session 정보 삭제하기
    1. 개별적인 Session데이터 삭제
      Session.removeAttribute("key값");
           ==> Session자체는 삭제되지 않고 개별적인 Session데이터만 삭제된다.
    2. Session자체를 삭제한다
      Session객체.invalidate();
            ==> Session자체가 삭제된다.

예시

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session 연습</title>
</head>
<body>

<%
// JSP문서에는 'session'이라는 이름으로 Session객체가 이미 저장되어 있다.
// 즉, 세션 관련 작업을 할 때는 바로 'session'을 사용하면 된다

%>

<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><br><br>

</body>
</html>

저장

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;

//Session 정보를 저장하는 서블릿
@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");
		PrintWriter out = response.getWriter();
		
		request.setCharacterEncoding("utf-8");
		// Session 정보를 저장하는 방법
		// 1. Session객체를 생성하거나 현재 Session 가져오기
		// 형식1) Request객체.getSession(); 또는 Request객체.getSession(true);
		//	==> 현재 Session이 존재하면 현재 Session을 반환하고, 존재하지 않으면 새로운 Session을 생성하여 반환한다.
		// 형식2) Request객체.getSession(false);
		// ==> 현재 Session이 존재하면 현재 Session을 반환하고, 존재하지 않으면 새로운 Session을 생성하지 않고 null을 반환한다
		HttpSession session = request.getSession();
		
		// 2. Session에 데이터를 저장하기
		// 형식) Session객체.setAttribute("key값", 데이터(session값))
		//	==> 'key값'은 문자열, '데이터'는 자바의 모든 자료형
		session.setAttribute("testSession", "연습용 세션입니다");
		session.setAttribute("userName", "오리");
		session.setAttribute("age", 20);
		
		out.println("<html> <head><meta charset='utf-8'><title>Session 저장 연습</title></head>");
		out.println("<body>");
		out.println("<h3>Session 데이터가 저장되었습니다</h3><br><br>");
		out.println("<a href='"+request.getContextPath()+"/session/sessionTest.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

읽기

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;


//Session 정보를 읽어오는 서블릿
@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");
		PrintWriter out = response.getWriter();
		
		request.setCharacterEncoding("utf-8");

		// Session 정보 읽어오기
		
		// 1. Session 객체를 생성하거나 현재 Session을 가져오기
		HttpSession session = request.getSession();
		
		out.println("<html> <head><meta charset='utf-8'><title>Session 읽기 연습</title></head>");
		out.println("<body>");
		out.println("<h3>저장된 Session 데이터 확인하기</h3><br><br>");
		out.println("<h4>Session 데이터 1개 확인하기</h4>");
		
		// 2. Session 데이터 읽기
		// 형식) Session객체.getAttribute("key값");
		String sessionValue = (String) session.getAttribute("testSession");
		
		if(sessionValue==null) {
			out.println("<h5>testSession의 세션값은 없습니다</h5>");
		} else {
			out.println("<h5>testSession의 세션 값 : "+sessionValue+"</h5>");
		}
		out.println("<br><hr><br>");
		out.println("<h4>전체 Session 데이터 확인하기</h4>");
		
		// Session에 등록된 모든 key값들 가져오기
		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>저장된 Session데이터가 없습니다</li>");
		out.println("<ol>");
		
		out.println("</ol>");
		
		out.println("<a href='"+request.getContextPath()+"/session/sessionTest.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

삭제

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;

//Session 정보를 삭제하는 서블릿
@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");
		PrintWriter out = response.getWriter();
		
		request.setCharacterEncoding("utf-8");

		// Session 정보 삭제하기
		// 1. Session객체 생성하거나 현재 세션 정보 가져오기
		HttpSession session = request.getSession();
		
		// 2. Session 정보 삭제하기
		// 방법1) 개별적인 Session데이터 삭제하기
		// 		형식) Session.removeAttribute("key값");
		//		==> Session자체는 삭제되지 않고 개별적인 Session데이터만 삭제된다.
		session.removeAttribute("testSession");
		
		// 방법2) Session자체를 삭제한다
		// 형식) Session객체.invalidate();
		//		==> Session자체가 삭제된다.
		session.invalidate();
		
		out.println("<html> <head><meta charset='utf-8'><title>Session 삭제 연습</title></head>");
		out.println("<body>");
		out.println("<h3>Session 데이터가 삭제되었습니다</h3><br><br>");
		out.println("<a href='"+request.getContextPath()+"/session/sessionTest.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

문제

- sessionLogin.jsp
   session을 확인하여 로그인 관련 session정보가 있으면 '***님 반갑습니다.'라는
   환영 메시지가 출력되고, session정보가 없으면 로그인 Form이 출력되도록 한다.
   (참고, JSP문서에서는 HttpSession객체가 자동으로 생성되어 session이라는 변수에 저장되어 있다.)

- 로그인 처리 서블릿 (sessionLogin.do)
  로그인 Form에서 ID와 Password를 받아서 ID가 'admin'이고 Password가 '1234'이면
  로그인 성공으로 처리 즉, session에 로그인 정보 저장하고 sessionLogin.jsp로 이동한다.
  
  로그인에 실패하면 아무 처리 없이 sessionLogin.jsp로 이동한다.

- 로그아웃 처리 서블릿(sessionLogout.do)
  session정보를 삭제하고 sessionLogin.jsp로 이동한다.

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 id = (String) session.getAttribute("id");

if(id==null){
	%>
	<form action="<%=request.getContextPath()%>/sessionLogin.do" method="post">
	<table border="1" style="margin : 1px auto">
	<tr>
	<td>ID : </td>
	<td><input name="id" placeholder="아이디를 입력하세요"></td>
	</tr>
	<tr>
	<td>PASSWORD : </td>
	<td><input name="pw" type="password" placeholder="비밀번호를 입력하세요"></td>
	</tr>
	<tr>
	<td colspan="2" style="text-align : center"><input type="submit" value="Login"></td>
	</tr>
	</table>
	</form>
	<%
} else{
	%>
	<div style="text-align : center">
	<h3><%=id %>님 반갑습니다</h3>
	<br>
	<a href="<%=request.getContextPath()%>/sessionLogout.do">로그아웃</a>
	</div>
	<%
}

%>
</body>
</html>

Login서블릿

package kr.or.ddit.session;

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("/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");
		
		if(id.equals("admin")&&pw.equals("1234")) {
			HttpSession session = request.getSession();
			session.setAttribute("id", id);
		}
		response.sendRedirect(request.getContextPath()+"/session/sessionLogin.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

Logout서블릿

package kr.or.ddit.session;

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("/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()+"/session/sessionLogin.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}