Chapter.06 - 세션관리(대화 상태 유지하기)
- 클라이언트를 구분하기위해서 IP는 사용할수 없다. (NAT 사용하면 동일하다)
- HTTPS나 ID 요청은 꼭 필요할 때만 사용하도록 합니다.
- 클라이언트에게 필요한 것은 유일한 세션ID 가 필요하다.
- 클라이언트와 컨테이너 사이에 세션ID를 공유하는 방법 - Cookie
- 컨테이너가 모든 Cookie 작업을 수행 합니다.
- Response 객체에 세션 Cookie 보내기 / 받기
즉 HttpSession session = request.getSession();에서 getSession 부분에서 쿠기 생성 및 관련 모든 작업을 수행함. - session.isNew() : 세션이 새로 생성되었으면 true 입니다.
- Request 객체 이외 세션을 얻는 다른 방법은?
HttpSessionEvent 혹은 HttpSessionBindingEvent에서 얻을 수 있음.
HttpSessionListener 인터페이스 구현에서 아래와 같이public void sessionCreated(HttpSessionEvent event){
HttpSesssion session = event.getSession();
} - 이미 만들어진 세션을 원할때
getSession(boolean)에서 getSession(false)를 호출하면 되고 만약 존재하지 않으면 null을 리턴 합니다. - 클라이언트가 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)sessionCreatedsessionDestroyedHttpSessionEventAn attribute classSome other class세션이 다른 VM으로 옮겨가는 것을 알고 싶을 때HttpSessionActivationListener(javax.servlet.http)sessionDidActivatesessionWillPassivateHttpSessionEventAn attribute classSome other class속성 클래스(속성의 값으로 사용되는 클래스)가 있고,이 타입의 클래스가 세션에 바인딩되거나 제거될 때를 알고 싶을 때.HttpSessionBindingListener(javax.servlet.http)valueBoundvalueUnboundHttpSessionBindingEventAn attribute classSome other class속성을 세션에 추가,제거, 대체를할 때를 아록 싶을 때HttpSessionAttributeListener(javax.servlet.http)attributeAddedattributeRemovedattributeReplacedHttpSessionBindingEventAn attribute classSome other class
댓글 없음:
댓글 쓰기