<상태 유지의 필요성>
웹 서버 프로그램의 경우 일반 애플리케이션과 다르게 조각나 있는 상태와 같기 때문에
클라이언트로부터 데이터를 요청받고 응답한 뒤 서블렛 조각 프로그램은 종료되어버린다.
그러한 이유로 서블렛 간의 작업을 이어가기 위해서는 전역 변수와 같은 개념이 필요한데, 그러한 것을 위해 사용되는 객체들이 있다.
= Application, Session, Cookie (기타_Hidden input, Querystring) =
Application 저장소 : 서블릿 컨텍스트(Context)
-어플리케이션(모든 서블릿) 전역에서 사용 가능
ServletContext application = request.getServletContext();
-서블릿 컨텍스트 생성
application.setAttribute("value", v);
application.setAttribute("operator", op);
-서블릿 컨텍스트에 객체 저장하기 (컬렉션의 Map과 같은 방식으로 저장된다)
application.getAttribute("value");
application.getAttribute("operator");
-서블릿 컨텍스트에 저장된 객체 가져오기 (말그대로 객체로 가져오므로 연산을 하려면 형변환이 필요하다)
Session 객체로 상태 값 저장하기
-세션(현재 접속한 사용자) 별로 사용 가능
(동일 브라우저 창은 다중 스레드로 구성되어 동일 세션을 사용하나, 다른 브라우저 끼린 다른 세션을 사용한다)
(세션의 사용자는 첫 response에 SID를 서버로부터 받아 이후의 요청에 사용한다)
(브라우저 개발자 도구의 network > cookie 에서 SID를 확인할 수 있다)
HttpSession session = request.getSession();
-세션 생성
session.setAttribute("value", v);
session.setAttribute("operator", op);
session.getAttribute("value");
session.getAttribute("operator");
-사용법은 서블릿 컨텍스트와 같다.
void setAttribute(String name, Object value)
-지정된 이름으로 객체를 설정
Object getAttribute(String name)
-지정한 이름의 객체를 반환
void invalidate()
-세션에서 사용되는 객체들을 바로 해제
void setMaxInactiveInterval(int interval)
-세션 타임아웃을 정수(초)로 설정
boolean isNew()
-세션이 새로 생성되었는지를 확인
Long getCreationTime()
-세션이 시작된 시간을 반환, 1970년 1월 1일을 시작으로 하는 밀리초
long getLastAccessedTime()
-마지막 요청 시간, 1970년 1월 1일을 시작으로 하는 밀리초
(세션 사용자들의 데이터를 항상 서버에서 저장하고 있을 수는 없기 때문에 위와 같은 추가 메소드를 사용한다)
Cookie를 이용해 상태 값 유지하기
-Application, Session이 서버 측에서 만들어지는 저장소라면 쿠키는 사용자(클라이언트) 브라우저에서 저장한다
Cookie(브라우저) === TCP/IP 정보, 헤더정보(브라우저가보냄), 사용자데이터 ===> 서버
서버 === 헤더정보 ===> Cookie
request.getHeader("remote-host")
-헤더 정보 가져오기
request.getParameter("x")
-사용자데이터 가져오기
Cookie cookie = new Cookie("c", String.valueOf(result));
response.addCookie(cookie);
-쿠키 저장하기(저장시키기 혹은 저장요청하기...)(쿠키는 문자열 형태로만 저장할 수 있기에 형변환 시켜준다)
Cookie[] cookies = request.getCookies();
String _c = "";
if (cookies != null)
for (Cookie cookie : cookies)
if("c".equals(cookie.getName()))
_c = cookie.getValue();
-쿠키 읽기
cookie.setPath("/");
-쿠키 적용 url 설정하기
( "/" 모든 서블렛, "/abc" abc 주소가 요청할때만, "/abc/" abc가 포함된 모든 하위 서블렛 )
cookie.setMaxAge(int second);
-쿠키 수명 설정하기
(0으로 설정시 즉시 삭제된다)
(기본값 : 브라우저의 생존주기와 같음)
(설정시 브라우저가 닫혀도 외부파일로 남아 설정한 시간동안 유지된다)
ex)
Cookie[] cookies = request.getCookies();
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/");
valueCookie.setMaxAge(24*60*60);
opCookie.setPath("/");
response.addCookie(valueCookie);
response.addCookie(opCookie);
Application, Session, Cookie의 차이점 정리
사용범위 | 생명주기 | 저장위치 | |
Application | 전역 범위 에서 사용하는 저장 공간 | WAS가 시작해서 종료할 때까지 | WAS 서버의 메모리 |
Session | 세션 범위에서 사용하는 저장 공간 | 세션이 시작해서 종료할 때까지 | WAS 서버의 메모리 |
Cookie | Web Browser별 지정한 path 범주 공간 | Browser에 전달한 시간부터 만료시간까지 | Web Browser의 메모리 또는 파일 |
오랜시간 저장해야하는 데이터라면 무조건 Cookie로 저장한다.
특정범위, 특정URL에서만 사용하는 데이터 또한 Cookie로 저장한다.
'Development > Java' 카테고리의 다른 글
Servlet & JSP (method) #4 (0) | 2022.08.13 |
---|---|
Servlet (service, doGet, doPost) #3 (0) | 2022.08.13 |
Servlet #1 (0) | 2022.08.11 |
Tomcat (0) | 2022.08.11 |
JDBC (0) | 2022.08.07 |