https://www.youtube.com/playlist?list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9

세션

세션도 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단이다.

단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체로 존재한다. 브라우저가 서버에 접근할 때마다 고유한 세션 아이디를 제작한다.

로컬이 아닌 서버에 존재하므로, 보안에 강하다. jsp 로만 접근이 가능하다.

쿠키는 용량과 갯수에 제한이 있으나, 세션은 제한이 없다.

생성 방법

  1. 클라이언트 요청 (웹브라우저)
  2. session 자동 생성
  3. Session 속성 설정: 내부 객체 사용

메소드

  • setAttribute(), getAttribute(): 세션에 있는 데이터 설정
  • getAttributeNames(): 세션에 저장되어 있는 모든 데이터의 이름(고유한 키 값)을 얻음
  • getId(): 자동 생성된 세션의 고유한 아이디를 얻음
  • isNew(): 최초 생성되었는지, 이전에 생성된 세션인지를 구분
  • getMaxInactiveInterval(): 세션의 유효시간을 얻는다. 가장 최근 요청시점을 기준으로 카운트. web.xml<session-config> 태그에 유효시간이 분 단위로 지정된다. getter 로 가져오는 값은 초 단위 이다.
  • removeAttribute(): 세션에서 특정 데이터를 제거
  • invalidate(): 세션의 모든 데이터 삭제

예제

<!-- sessioninit.jsp -->
<%
  session.setAttribute("mySessionName", "mySessionData");
  session.setAttribute("myNum", 12345);
%>

<a href="sessionget.jsp">session get</a>
<!-- sessionget.jsp-->
<%
		//getAttribute()
		Object obj1 = session.getAttribute("mySessionName"); //Object
		String mySessionName = (String)obj1; //캐스팅 필수
		out.println(mySessionName +"<br />");

		Object obj2 = session.getAttribute("myNum");
		Integer myNum = (Integer)obj2;
		out.println(myNum +"<br />");

		//getAttributeNames()
		String sName;
		String sValue;
		Enumeration enumeration = session.getAttributeNames(); //Enumeration
		while(enumeration.hasMoreElements()){
			sName = enumeration.nextElement().toString();
			sValue = session.getAttribute(sName).toString();
			out.println("sName : " + sName + "<br />");
			out.println("sValue : " + sValue + "<br />");
		}

		//getId()
		String sessionID = session.getId(); //하나의 고유한 아이디
		out.println("sessionID : " + sessionID + "<br />");

		//getMaxInactiveInterval()
		int sessionInter =  session.getMaxInactiveInterval(); // 초 단위
		out.println("sessionInter : " + sessionInter + "<br />");


		//removeAttribute()
		session.removeAttribute("mySessionName"); //해당 세션 삭제

		//삭제되었는지 확인
		Enumeration enumeration1 = session.getAttributeNames();
		while(enumeration1.hasMoreElements()){
			sName = enumeration1.nextElement().toString();
			sValue = session.getAttribute(sName).toString();
			out.println("sName : " + sName + "<br />");
			out.println("sValue : " + sValue + "<br />");
		}

		//invalidate()		
		session.invalidate(); // 전체 세션 삭제

		//request.isRequestedSessionIdValid()
		if(request.isRequestedSessionIdValid()) { //세션 아이디가 유효한지
			out.println("session valid");
		} else {
			out.println("session invalid");
		}
	%>

세션으로 로그인/로그아웃 구현

<!-- login.html -->
<form action="loginOk.jsp" method="post">
  아이디 : <input type="text" name="id" size="10"><br />
  비밀번호 : <input type="password" name="pw" size="10"><br />
  <input type="submit" value="로그인">
</form>
<!-- loginOk.jsp -->
<%!
		String id, pw;
	%>
	<%
		id = request.getParameter("id");
		pw = request.getParameter("pw");

		if(id.equals("abcde") && pw.equals("12345")) {
			session.setAttribute("id", id); //아이디 값으로 세션 설정
			response.sendRedirect("welcome.jsp");
		} else {
			response.sendRedirect("login.html");
		}
	%>
<!-- welcome.jsp -->
<%
  Enumeration enumeration = session.getAttributeNames();
  while(enumeration.hasMoreElements()){
    String sName = enumeration.nextElement().toString();
    String sValue = (String)session.getAttribute(sName);

    if(sValue.equals("abcde")) out.println(sValue + "님 안녕하세요." + "<br />");
  }
%>

<a href="logout.jsp">로그아웃</a>
<!-- logout.jsp-->
<%
  Enumeration enumeration = session.getAttributeNames();
  while(enumeration.hasMoreElements()) {
    String sName = enumeration.nextElement().toString();
    String sValue = (String)session.getAttribute(sName);

    if(sValue.equals("abcde")) session.removeAttribute(sName);
  }

%>

<%
		Enumeration enumeration = session.getAttributeNames();
		int i = 0;
		while(enumeration.hasMoreElements()) {
			i++;

			String sName = enumeration.nextElement().toString();
			String sValue = (String)session.getAttribute(sName);

			out.println("sName : " + sName + "<br />");
			out.println("sValue : " + sValue + "<br />");
		}

		if(i == 0) out.println("해당 세션이 삭제 되었습니다.");

	%>