2013년 9월 7일 토요일

[Head First]Servlets & JSP 내용정리-6장

Chapter.06 - 세션관리(대화 상태 유지하기)


  1. 클라이언트를 구분하기위해서 IP는 사용할수 없다. (NAT 사용하면 동일하다)
  2. HTTPS나 ID 요청은 꼭 필요할 때만 사용하도록 합니다.
  3. 클라이언트에게 필요한 것은 유일한 세션ID 가 필요하다.
  4. 클라이언트와 컨테이너 사이에 세션ID를 공유하는 방법 - Cookie
  5. 컨테이너가 모든 Cookie 작업을 수행 합니다.
    • Response 객체에 세션 Cookie 보내기 / 받기
      즉 HttpSession session = request.getSession();에서 getSession 부분에서 쿠기 생성 및 관련 모든 작업을 수행함.
    • session.isNew() : 세션이 새로 생성되었으면 true 입니다.
  6. Request 객체 이외 세션을 얻는 다른 방법은?
    HttpSessionEvent 혹은 HttpSessionBindingEvent에서 얻을 수 있음.
    HttpSessionListener 인터페이스 구현에서 아래와 같이
    public void sessionCreated(HttpSessionEvent event){
    HttpSesssion session = event.getSession();
    }
  7. 이미 만들어진 세션을 원할때
    getSession(boolean)에서 getSession(false)를 호출하면 되고 만약 존재하지 않으면 null을 리턴 합니다.
  8. 클라이언트가 Cookie를 사용하지 않는 경우에도 작동하도록 하는 방법
    URL 재작성 : URL + ;jessionid=1234567
    관련 메소드 : response.encodeURL(“”)
    public void doGet(HttpServletRequest request....){
     HttpSession session = request.getSession();
     out.println(“<a href=\””+response.encodeURL(“/BeerTest.do”)+”\”>click me</a>”);
    }

    • JSP로 보내고 세션은 계속 유지 하고 싶은 경우 : response.encodeRedirectURL(“$URL”);  
      JSP에서는 JSTL 태그 <c:URL>

    주요 HttpSession 메소드
    메소드명
    하는 일이 무얼까요?
    어떤 경우에 쓸가요?
    getCreationTime()
    세션이 생성된 시간을 리턴함.
    세션이 얼마나 오래 되었는지 알고 싶을 때.
    특정 시간만 세션을 사용하도록 제한하는데 사용될 수 있다. (로그인 후 10만 사용)
    getLastAccessedTime()
    이 세션으로 들어온 마지막 요청 시간을 리턴합니다.(밀리초 단위)
    클라이언트가 언제 마지막으로 세션에 접근 했는지 알고 싶을때. 클라이언트가 장시간 사용이 없을 경우, 메일을 보내 다시 사용하러 올것인지 물어 볼때 사용할 수 있겠죠.
    setMaxInactiveInterval()
    해당 세션에 대한 요청과 요청간의 최대 허용시간 (초 단위)을 지정
    클라이언트의 요청이 정해진 시간이 지나도 들어 오지 않을 경우. 해당 세션을 제거하기 위하여 사용함. 서버 상에 짝 잃은 세션을 최소화하기 위해 사용합니다.
    getMaxInactiveInterval()
    해당 세션에 대한 요청과 요청간의 최대 허용시간 (초 단위)을 리턴합니다.
    세션이 얼마나 오랫동안 비활성화 상태였는지, 여전히 살아있기는 한지 알고 싶을 때. 세션이 invalidate() 되기까지 시간이 얼마나 남았는지 알기 위하여 사용할 수도 있습니다.
    invalidate()
    세션을 종료합니다. 이 작업에는 현재 세션에 저장된 모든 세션 속성을 제거하는(unbind) 작업이 포함됩니다.
    클라이언트가 비활성화이거나 세션작업이 완료되어 강제로 세션을 종료할 때(예를 들면 장바구니 결제를 완료했을때). 세션 객체 자체는 컨테이너가 내부적으로 재사용합니다. 여기에 대해선 여려분의 신경쓸 필요가 없죠.
    invalidate()는 세션ID가 더 이상 존재하지 않으니, 관련 속성을 세션 객체에서 제거하라는 의미입니다.

    세션이 종료되는 세 가지 이유
    • 시간이 다 되어서(타임 아웃)
    • 개발자 세션 객체에 invalidate() 메소드를 실행하는 경우
    • 애플리케이션이 다운되는 경우(문제가 생겨 다운되거나, 언디플로이(undeploy)되는 경우).

    DD에서 세션 타임아웃을 설정하기 및 특정세션만 타임 아웃 설정하기
    <web-app ...>
     <session-config>
         <session-timeout>15</session-timeout>
         -------------------------------------
         15는 분을 의미 합니다.
     </session-config>
    </web-app>

    특정 세션만 타임 아웃 설정하는 코드
    session.setMaxInactiveInterval(20*60);  //여기서는 초단위 임.
                                  -----
    만약 0 초 이면 바로 타임 아웃 처리를 합니다.

    세션 관련 리스너들
    시나리오
    리스너
    인터페이스/메소드
    이벤트 타입
    일반적으로 구현하는
    클래스
    얼마나 많은 동시 사용자가 있는지 알고 싶을 때. 즉 활성화된 세션들 뒤를 캐고 싶을 때
    HttpSessionListener
    (javax.servlet.http)
    sessionCreated
    sessionDestroyed
    HttpSessionEvent
    An attribute class
    Some other class
    세션이 다른 VM으로 옮겨가는 것을 알고 싶을 때
    HttpSessionActivationListener
    (javax.servlet.http)
    sessionDidActivate
    sessionWillPassivate
    HttpSessionEvent
    An attribute class
    Some other class
    속성 클래스(속성의 값으로 사용되는 클래스)가 있고,이 타입의 클래스가 세션에 바인딩되거나 제거될 때를 알고 싶을 때.
    HttpSessionBindingListener
    (javax.servlet.http)
    valueBound
    valueUnbound
    HttpSessionBindingEvent
    An attribute class
    Some other class
    속성을 세션에 추가,제거, 대체를할 때를 아록 싶을 때
    HttpSessionAttributeListener
    (javax.servlet.http)
    attributeAdded
    attributeRemoved
    attributeReplaced
    HttpSessionBindingEvent
    An attribute class
    Some other class

댓글 없음: