서블릿에서 세션 API 이용하기
// SessionTest.java
package sec03.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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("/sess")
public class SessionTest extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디: " + session.getId() + "<br>");
out.println("최초 세션 생성 시각: " + session.getCreationTime() + "<br>");
out.println("최근 세션 접근 시각: " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.println("새 세션이 만들어졌습니다.");
}
}
}
세션 유효 시간을 따로 설정하지 않으면 톰캣에서 기본으로 설정한 유효 시간인 30분이 적용된다.
브라우저에서 최초로 요청 시에는 생성된 세션 객체에 할당된 세션 id와 여러 가지 정보를 출력한다.
같은 브라우저에서 다른 탭을 열고 요청하면 같은 세션 id를 출력하므로 최초 생성된 세션을 재사용 하게 되는 것이다.
(새 세션이 만들어졌다는 메시지가 출력되지 않았다.)
브라우저로 전송되어 세션 쿠키에 쿠키 이름 jsessionID로 저장된 세션 id는 다음과 같다.
현재 윈도 10의 운영체제에서는 같은 PC의 브라우저나 다른 탭에서 요청을 해도 기존 세션을 유지한다.
하지만 다른 브라우저의 탭에서 요청을 하게 되면 다른 세션 id가 출력되는 것을 확인할 수 있고,
하지만 크롬을 시크릿모드로 실행하게 되면 다른 세션 id를 출력할 수 있다.
세션 유효 시간 확인하기
세션 기본 유효 시간은 톰캣 컨테이너에서 지정한 30분(1800초)이다. 그러나 HttpSession의 setMaxInactiveInterval( ) 메서드를 이용하면 사용자가 원하는 세션 유효 시간을 설정할 수 있다. 그리고 invalidate( ) 메서드를 이용하면 세션을 삭제하는 것이 가능하다.
세션 유효 시간 재설정하기
// SessionTest2.java
package sec03.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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 SessionTest2
*/
@WebServlet("/sess2")
public class SessionTest2 extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디: " + session.getId() + "<br>");
out.println("최초 세션 생성 시각: " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각: " + session.getLastAccessedTime() + "<br>");
out.println("기본 세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
session.setMaxInactiveInterval(5);
out.println("세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
if (session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
}
}
최초 요청 시에는 세션 아이디가 아래와 같다.
5초가 지난 후 같은 브라우저에서 재요청하면 다시 8DBCAADC2E5E2B637F0BBB20723D5A6D라는 새 세션이 생성된다.
최초 요청 시 세션의 id와 5초가 지난 후 요청 시 세션의 id가 다르다. 즉, 5초 이후에는 기존 세션은 삭제되고 재요청 시 새 세션이 생성되는 것이다.
이러한 세션 유효 시간을 재설정하는 경우는 주로 은행 사이트에서 자주 사용한다.
이번에는 사용자가 강제로 세션을 삭제하는 기능을 알아보자.
// SessionTest3.java
package sec03.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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 SessionTest3
*/
@WebServlet("/sess3")
public class SessionTest3 extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디: " + session.getId() + "<br>");
out.println("최초 세션 생성 시각: " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각: " + session.getLastAccessedTime() + "<br>");
out.println("기본 세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
session.setMaxInactiveInterval(5);
out.println("세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
if (session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
session.invalidate();
}
}
최초 요청 시 새 세션이 생성된다. 그리고 invalidate( ) 메서드가 호출되기 때문에 세션이 바로 소멸된다.
재요청 시 다시 다른 세션이 생성된다.