다연이네

[days07] 세션(Session) 본문

JSP

[days07] 세션(Session)

 다연  2021. 1. 4. 19:32
반응형

   1. 세션(Session) - 상태관리


   2. 쿠키와 다른 점은 서버 상태 관리 (쿠키는 클라이언트에서)


   3. 인증 / 권한을 대부분 세션을 사용해서 처리


   4. 웹 컨테이너는 기본적으로 하나의 웹브라우저마다 하나의 세션(저장공간)을 생성한다.
       == WAS 컨테이너 == 톰캣 컨테이너
       (서블릿 생성~소멸 모든 것 관리하는 공장)
       서블릿은 언제 생성 ? 
         클라이언트 요청 -> 서블릿 생성
                        응답 <- 


    5. 세션 생성  (지시자에서  session="true" ) 기본 설정

       <%@ page session="true" %>


    6. 세션 처리 과정 이해
        [ url ] -> 첫 요청                                 서버[캐비넷(세션)]
                  <- 열쇠/비밀번호                       세션아이디 jsessionid 쿠키값 저장
         jsessionid 쿠키 저장                             [캐비넷(세션)] 
         
     7. 세션 종료(제거) 언제 ?
           ㄱ. 더 이상 요청이 없으면 일정 시간(20분-정확하진 않음)이 지난 후엔 세션 제거
           ㄴ. 강제 제거하는 메소드로 제거 가능 invalidate()


     8. session 기본 객체 메소드
           ㄱ. getId() : 세션id를 얻어오는 메소드
           ㄴ. getCreationTime() : 세션이 생성된 시간을 얻어오는 메소드 (1970.1.1~시간, 단위:ms)
           ㄷ. getLastAccessedTime() : 웹 브라우저가 가장 마지막에 세션에 접근한 시간
           

 

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
   $(document).ready(function (){     
   });
</script>
</head>
<body>

<%
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf  = new SimpleDateFormat(pattern);
Date date = new Date();
date.setTime(session.getCreationTime());

%>

<h3>세션 정보 확인</h3>
세션ID: <%=session.getId() %><br>

세션 생성된 시간: <%=session.getCreationTime() %><br>
세션 생성된 시간: <%=sdf.format(date)%><br>
<%
date.setTime(session.getLastAccessedTime());
%>
세션 최근 접근 시간: <%=session.getLastAccessedTime() %><br>
세션 최근 접근 시간: <%=sdf.format(date) %><br>
</body>
</html>

 

 

세션의 유효 시간 설정(세션 타임 아웃)

세션 타임아웃을 설정하지 않으면 (명시적으로 invalidate() 제거하지 않으면)
계속 메모리에 남게되어 메모리 부족 현상이 발생한다. 그래서 반드시 세션 타임아웃을 지정해주어야 한다.

<%
   //세션의 유효 시간 설정(세션 타임 아웃)
	int interval = 60*20; //단위(초)  ==20분
	session.setMaxInactiveInterval(interval);
%>

또는 web.xml에 가서 설정

<!-- 단위(분) - 세션 타임 아웃을 web.xml에서 20분 설정하겠다 -->
  <session-config>
  <session-timeout>20</session-timeout>
  </session-config>

주의 점은 jsp 안의 스크립트릿 안에서 설장할 때 단위는 , web.xml에서 설정할 때 단위는 이라는 것이다.

 

 

 

 

 

<body>
<%
   //세션 [캐비넷==서버 저장공간]
   //브라우저 마다 -> 첫 요청 -> [세션]
   //클라이언트 : jsessionid 쿠키값 = 세션ID

   //4가지 영역(Scope)
   
   //request 값 저장 
   request.setAttribute("deptno", "10"); 
   
   // 세션 값(data) 저장(쓰기)
   //session.setAttribute(name, value); 
   session.setAttribute("empno", "7566"); 
   session.setAttribute("ename", "SMITH"); 
%>

<!-- 세션에 저장된 값을 확인 -->
<a href="ex05_02.jsp">ex05_02.jsp</a><br>
<a href="ex05_03.jsp">ex05_03.jsp</a><br>

<!-- 서블릿에서 session 생성하는 방법 -->
<a href="/jspPro/ses">/jspPro/ses</a><br>

</body>

1번 클릭시

<body>
<%
   String deptno = (String)request.getAttribute("deptno");
   String empno = (String)session.getAttribute("empno");
   String ename = (String)session.getAttribute("ename");
%>
<ul>
	<li>deptno: <%=deptno %></li>
	<li>empno: <%=empno %></li>
	<li>ename: <%=ename %></li>
</ul>
</body>

request로 받은 값만 null이 뜨고 session으로 받은 값들은 잘 뜬다.

 

2번 클릭시

<body>

empno: <%=session.getAttribute("empno") %><br>

<!-- EL(표현 언어) -->
<!-- EL 세션 객체 : sessionScope -->
empno: ${sessionScope.empno } <br>

<!-- 
pageScope 에서 뒤진 후 requestScope에서 뒤진 후 
sessionScope 뒤진 후 applicationScope 뒤짐 => 이름만 줘도 된다 -->
empno: ${empno } <br>
 
 <a href="ex05_04.jsp">세션 강제 종료</a>
</body>

session 값을 불러오는 방법 3가지

 

- <%=session.getAttribute("empno")%>

 

- ${sessionScope.empno}

 

- ${empno}

pageScope -> requestScope -> sessionScope -> applicationScope 뒤짐=>이름만 줘도 4가지 Scope를 모두 뒤져 찾음

 

 

강제종료 클릭시

<%
  //강제 종료 메소드 : invalidate()
  //session 기본 객체를 제거하고 session 기본 객체에 저장된
  //속성 목록도 함께 삭제하는 메소드
  session.invalidate();
%>

강제종료!!

 

세션을 강제종료 한 뒤 뒤로가기를 눌러 다시 1번, 2번을 각각 클릭하면 값이 없다.

1번 클릭시
2번 클릭시

 

3번 클릭시 (빈페이지)

서블릿에서 session 생성하는 방법

package days07;

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;

/**
 * Servlet implementation class SessionTest
 */
@WebServlet("/ses")
public class SessionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SessionTest() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, 
				HttpServletResponse response) throws ServletException, IOException {
		//System.out.println("SessionTest.doGet()....");
		
		//서블릿에서는 기본 객체가 없다 => 어떻게 세션 객체를 사용 ?
		//[ 서블릿에서 session 객체를 사용하는 방법 ]
		boolean create = false;
		HttpSession session = request.getSession(create);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, 
				HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 [기억]  - create 값 차이점
ㄱ.  false
     세션 객체가 존재하지 않을 경우에는 null을 반환

ㄴ.  true

     세션 객체가 존재하지 않을 경우에는 세션 객체를 새로 생성해서 반환

 

if(session!=null) {

} //이걸 true 주면 안먹는다 

반응형
Comments