세션

서현서현·2022년 5월 26일
0

서블릿 & JSP

목록 보기
13/26

세션(HttpSession)

  • session객체는 세션이 끊길때까지 유지됨
  • 세션을 통해서 사용자(웹브라우저) 별로 구분하여 정보를 관리 할 수 있다. (세션 ID이용)
  • 쿠키를 사용할때보다 보안이 향상된다(정보가 서버에 저장되기 때문에)
**[세션객체를 가져오는 방법]**
HttpSession session = req.getSession(boolean);

boolean: true => 세션객체가 존재하지 않으면 새로 생성한다.
						false => 세션객체가 존재하지 않으면 null을 리턴한다

세션 생성 예제

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class T06_ServletSessionTest extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 세션을 가져오는데 없으면 새로운 객체로 생성한다
		HttpSession session = **req.getSession(true);**
	  // true : 있으면 그거 주고 없으면 새로만들자!
		
		//생성시간 가져오기
		Date createTime = new Date(session.getCreationTime());
		
		// 마지막 접근시간 가져오기
		Date lastAccessTime = new Date(session.getLastAccessedTime());
		
		String title = "재방문을 환영합니다";
		int visitCount = 0; //재방문 횟수
		String userId = "CSH"; //사용자 아이디
		
		if(session.isNew()) { // 세션이 새로 만들어졌는지 확인
			title="처음 방문을 환영합니다";
			session.setAttribute("userId", userId); // 사용자 아이디 설정
		} else {
			visitCount = (Integer) session.getAttribute("visitCount");
			visitCount++;
			userId = (String) session.getAttribute("userId");
		}
		System.out.println("visitCount ; "+visitCount);
		session.setAttribute("visitCount", visitCount);
		
		// 응답헤더에 인코딩 및 Content Type 설정하기
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		out.println("<!doctype html><html><head><title>"+title
				+ "</title></head><body>"
				+ "<h1 align=\"center\">"+title+"</h1>"
				+ "<h2 align=\"center\">세션정보</h2>"
				+"<table border = \"1\" align=\"center\">"
				+ "<tr bgcolor=\"orange\"><th>구분</th><th>값</th></tr>"
				+ "<tr><td>세션ID</td><td>"+session.getId()+"</td></tr>"
				+ "<tr><td>생성시간</td><td>"+createTime+"</td></tr>"
				+ "<tr><td>마지막 접근시간</td><td>"+lastAccessTime+"</td></tr>"
				+ "<tr><td>User ID</td><td>"+userId+"</td></tr>"
				+ "<tr><td>방문횟수</td><td>"+visitCount+"</td></tr></table>"
				+ "</body></html>");
	}
	
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}

}

Untitled

새로고침시 방문횟수 늘어난다

Untitled

이런게 자동 생성되어있네

JSESSIONID란?

  • 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키
  • HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고 응답후 연결은 끊기게 되므로 상태를 유지할 수 없다.
  • 따라서, 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 한다.

세션 삭제 예제

**[세션 삭제 처리 방법]**
1. invalidate() 호출
2. setMaxInactiveInterval(int interval) 호출
	=> 일정시간()동안 요청이 없으면 세션객체 삭제됨
3. web.xml에 <session-config> 설정하기. (분단위)

삭제 방법 1

  • 가장 많이 사용하는 방법! 로그아웃에 구현
		System.out.println("visitCount ; "+visitCount);
		session.setAttribute("visitCount", visitCount);
	
		**session.invalidate(); // 세션객체 제거**

Untitled

Untitled

새로고침 할때마다 세션ID가 변화

2.

		System.out.println("visitCount ; "+visitCount);
		session.setAttribute("visitCount", visitCount);
		
		**session.setMaxInactiveInterval(10);  // 간격을 준다**

Untitled

Untitled

방문횟수가 카운트 되다가 10초라는 간격을 주고 리로드 하면 0으로 초기화되어있다

3. web.xml

<session-config>
		<session-timeout>1</session-timeout>
	</session-config>

1분으로 세팅

Untitled

Untitled

1분후 리로드 하면 0됨

💡 본 코드에서는 serMaxAge()를 설정하지 않았으므로 브라우저 닫으면 세션이 끊기며, 관리되고 있던 서버의 데이터들이 모두 사라진다.

0개의 댓글