세션이 종료되는 3가지 이유

 

시간이 다 되어서(타임 아웃)

개발자가 세션 객체에 invalidate()메소드를 실행하는 경우.

애플리케이션이 다운되는 경우(문제가 생기거나, 언디플로어 되는 경우)

 

 

DD에서 세션 타임아웃 설정하기

DD에서 설정하는 타임아웃은 생성되는 모든 세션에 setMaxInactiveInterval()메소드를 호출하는 것과도 같습니다.

 

<web-app....>

 <servlet>

 ...

 </servlet>

 <session-config>

  <session-timeout>15</session-timeout>

 </session-config>

</web-app>

15는 15분을 의미합니다. 클라이언트가 15분동안 요청이 없으면 제거하라는 의미 입니다. 제거 한다는 것은 클라이언트를 제거하는 것이 아니라 세션만 제거 하는 것을 의미 합니다.

DD상의 타임아웃 단위는 분입니다. 타임아웃의 단위들은 일치하지 않습니다. DD에서는 분단위고 프로그램 내부에서는 초단위 입니다.

 

특정 세션만 타임아웃 설정하기

특정 세션 인스턴스만 세션 타임아웃 값을 변경할 수 있습니다. 다른 세션의 타임아웃 값은 바뀌지 않습니다.

 

session.setMaxInactiveInterval(20*60);

인자값은 초다윈 시간입니다. 위 코드는 20분동안 요청이 없으면 제거한다는 의미 입니다.

 

간단한 예제

 

public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException{

 response.setContentType("text/html");

 PrintWriter out = response.getWriter();

 HttpSession session = request.getSession();

 session.setAttribute("foo", "42");

 session.setAttribute("bar", "420");

 session.invalidate();

 String foo = (String)session.getAttribute("foo");

 out.println("Foo : " + foo);

}

위의 예제에서는 session.invalidate()를 호출한 시점에서 세션은 무효화 되었습니다. 그래서 그 이후 session.getAttribute를 호출할때 런타임 익셉션이 발생되어 IllegalStateException이 던져 집니다.

 

 

public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException{

 response.setContentType("text/html");

 PrintWriter out = response.getWriter();

 HttpSession session = request.getSession();

 session.setAttribute("food", "42");

 session.setMaxInactiveInterval(0);

 String foo = (String)session.getAttribute("foo");

 if(session.isNew()){

  out.println("This is a new session.");

 } else{

  out.println("Welcome back!");

 }

 out.println("Foo : " + foo);

}

 

문제의 원인은 session.setMaxInactiveInterval(0);에 있습니다. 이말은 세션을 곧바로 타임아웃 하라는 말입니다. 세션이 무효화 된 다음에는 isNew()메소드를 호출 할 수 없습니다. 이런경우 IllegalStateException이 발생됩니다. 최대 비활성화 시간 간격을 0으로 설정하는 것은 세션을 타임아웃하고 곧바로 무효화 하라는 의미 입니다.


출처 - http://blog.naver.com/khagaa/30028163330


Posted by linuxism
,


http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/package-summary.html

이곳에 보시면, 서블릿 컨텍스나 세션의 변화를 체크하여 리스너들이 있습니다.

리스너 인터페이스를 구현하여 클래스를 만들면 되구요 web.xml에 해당 리스너 클래스를 추가해 주시면 됩니다.

 

package com.cafe24.youmasan.common;

import java.sql.SQLException;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class LoggingListener
implements HttpSessionListener {

 public LoggingListener() {
 }

 public void sessionCreated(HttpSessionEvent hse) {
  HttpSession session = hse.getSession();
  session.setMaxInactiveInterval(60*30);//초단위로 세션유지 시간을 설정합니다
  System.out.println(session.getId()+": 세션이 생성되었습니다.");
 }


 public void sessionDestroyed(HttpSessionEvent hse) {

  HttpSession session = hse.getSession();
  System.out.println(session.getId()+": 세션이 소멸되었습니다."); 
 }

}

 

세션의 변화를 체크하기 위해 HttpSessionListener인터페이스를 구현해 리스너 클래스를 만들구요

 

web.xml <web-app>태그안에

   </servlet>
 <listener>
  <listener-class>com.cafe24.youmasan.common.LoggingListener</listener-class>
 </listener>

리스너를 등록해 주시면 됩니다.

 

중간에

 session.setMaxInactiveInterval(60*30);//초단위로 세션유지 시간을 설정합니다

설정을 통해 세션의 생명시간을 설정해 줄수 있습니다.

 

브라우저가 닫힐경우 session.invalidate()같은 세션종료 명령을 서버에 보내주지 못합니다.

그렇게 때문에 서버는 브라우저와 세션의 연결이 끊겼다는 사실을 모르고 마냥 요청을 기다리게 됩니다.

세션의 생명시간동안 응답이 없다면  그제서야 서버는 닫힌 브라우저와의 세션을 종료합니다.

 

인터페이스를 구현한

 public void sessionDestroyed(HttpSessionEvent hse) {}

메소드안에서 세션종료시 처리 로직을 추가해 주시면 됩니다.


출처 - http://blog.daum.net/nationisone/8197009



Posted by linuxism
,


기본적으로 HttpSessionListener를 구현(Implements)하여 세션이 생성 되는 시점과 세션이 사라지는 시점을 가지고 올 수 있다.

세션을 생성 되는 시점에 DB나 특정 Static 변수에 세션 정보를 저장 하고 세션이 종료될 때 그 세션 정보를 지워 줌으로써

해당 세션의 중복 로그인을 막을 수 있으며 현재 접속중이 접속자 정보를 가지고 올 수 있다.

package com.moainfo.http.session;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MoaSessionListener implements HttpSessionListener
{
 public void sessionCreated(HttpSessionEvent se)
 {
  HttpSession session = se.getSession();
  System.out.println("Create session : " + session.getId());
 }
 public void sessionDestroyed(HttpSessionEvent se)
 {
  HttpSession session = se.getSession();
  System.out.println("Close session : " + session.getId());
  
 }
}


출처 - http://definejava.net/


===================================================================================


HttpSessionBindingListener vs HttpSessionListener

HttpSessionBindingListener 는 이 인터페이스를 임플리먼츠한 객체를 세션에 바인딩 시키거나 언바인딩 될때 이벤트가 발생합니다. 반면에 HttpSessionListener 인터페이스는 톰캣의 web.xml에 리스너로서 등록을 하면 해당사이트에서 세션이 생성될때 ,글구 소멸될때 발생합니다. 순수한 세션 카운팅을 할때 꼭 필요합니다. ^^;;


출처 - http://www.okjsp.pe.kr/seq/28283





Posted by linuxism
,