keytool.exe -genkey -alias juheon -keyalg RSA -keypass 1234qwer -storepass 1234qwer -keystore juheon.jks keytool.exe -export -alias juheon -storepass 1234qwer -file juheon.cer -keystore juheon.jks keytool.exe -importkeystore -srckeystore juheon.jks -destkeystore juheon.key.p12 -deststoretype PKCS12 D:\Java\32bit\jdk1.5.0_22\jre\lib\security\cacert D:\Java\32bit\jdk1.5.0_22\bin\keytool.exe -import -alias tsasample -keystore D:\Java\32bit\jdk1.5.0_22\jre\lib\security\cacert -file D:\workspace\Servers\tsa-server-web-config\tomcat.cer keytool -import -alias somansa -keystore C:\Program Files\Java\jdk1.8.0_102\jre\lib\security\cacert -file c:\somansa.cer #인증서 생성 keytool -genkey -alias keyAlias -keyalg RSA -keypass changeit -storepass changeit –validity 9999 -keystore keystore.jks keytool -export -alias keyAlias -storepass changeit -file server.cer -keystore keystore.jks keytool -import -v -trustcacerts -alias keyAlias -file server.cer ...
▶ Servlet의 각종 Listener 사용방법
자, 이번 글에서는 세션에 대한 binding이 이루어졌을때 서블릿 엔진이 어떠한 방식으로
해당 세션을 control할 수 있는지에 대하여 예제와 함께 살펴보도록 하자.
일반적으로 세션이라함은 쿠키와 같은 속성으로 분류가 되어질 수 있는데 보통 생각하기는
서버측에 저장되는 데이터정보라고 들었을 것이다. 사실 엄밀하게 말하자면
세션또한 클라이언트 브라우져에 속성을 이용하게 되는 것이지만 설명하면
더 복잡해지기만 하기 때문에 그냥 서버에 있는 서버의 메모리만큼의 영역을 차지할
수 있는 객체로서만 바라보도록 하자.
우선 Enterprise API의 리스너의 종류를 먼저 보도록 하자. 이러한 리스너들은 API의 util.EventListener를
이용하여 엔진이 실제 처리를 해주게 되는데 간단하게 설명해서 필터링 같은 서비스를 한다고
보면 무방할 듯하다. 필터가 무엇인지 모른다면, 그냥 간단하게 정수기라고 생각하자.
수도물을 그냥 먹을 수 없기 때문에 정수기를 통하여 이물질을 걸러내는 것처럼
자바에서도 우리가 실제 코딩한 서블릿측으로 request들이 넘어오기 전에 엔진들이 무언가를
걸러내게 할 수 있는 속성을 가지고 있다. 그 대표적인 예가 필터, 리스너이며
JDK1.2부터 설정된 event delegation속성을 이용하여 처리한다.
아래의 리스너들은 반드시 deployment descriptor에 설정되어 있어야 한다. DD가 궁금하면
서블릿 엔진의 web.xml에 설정이 되어져야 한다는 이야기이다.
▶ javax.servlet.ServletContextAttributeListener
이 리스너는 컨텍스트에 저장된 애트리뷰의 변화가 있었을 때 설정된 이벤트를 엔진이 자동으로
발생시키도록 한다. 이벤트 감지를 얻어내기 위해서는 여러분들이 직접 작성한 리스너의
implemention클래스를 통해야 하는것은 물론이며, 아래의 리스너 모두 동일하게 설정된다.
▶ javax.servlet.ServletContextListener
당신이 작성한 웹애플리케이션에서 컨텍스트를 이용하여 무언가를 저장하고 이용할 수 있는데
이 리스너의 작동은 그러한 컨텍스트에 대한 변경이 이루어졌을 때 자동으로 엔진이 감지하고
여러분들이 작성한 클래스의 이벤트를 발생시킨다.
▶ javax.servlet.http.HttpSessionActivationListener
request.getSession(true)같은 경우처럼 Session에 대한 내용이 새로 생성되어 activate되어졌을 때
발생하는 이벤트를 감지하는 리스너이다.
▶ javax.servlet.http.HttpSessionAttributeListener
HttpSession에 대한 애트리뷰트의 변경시 연결되어지는 리스너이다.
▶ javax.servlet.http.HttpSessionBindingListener
HttpSession에 대하여 클라이언트 세션정보에 대한 바인딩이 이루어졌을 경우 감지되는 리스너이며
이번 예제에서 사용될 리스너이기도 한다. HttpSessionBindingEvent객체를 실제 구현클래스로
넘겨주게 된다.
위의 리스너 모두 servlet2.3부터 나오기 시작했으며, 현재 사용되는 거의 모든 엔진들이 지원을
하고 있으므로 사용하는데 대하여 무리가 없으리라 본다.
자, 그러면 이제 예제를 하나 만들어보도록 하자.
놀새가 만들어볼 예제는 HttpSessionBindingListener라고 하였다.
이것을 왜 만들었는지부터 살펴보아야 하지 않을까? 이유는 간단했다. 예전 프로젝트의 경우
클라이언트 접속에 대하여 사용자정보를 세션에 담도록 하고 있는 그 담긴 세션에 대하여
정보를 얻어내려 하였다. 사용자 정보 및 저장된 세션에 대하여 collection에 현재 이용중인
사용자 및 그 사용자 정보들을 어드민 관리차원에서 보고 싶었던 것이다.
각종 리스너들을 이용한다면 그러한 정보들을 쉽게 얻어낼 수 있는 특징을 가지고 있었다.
▶세션이 연결된걸 감지한다면 끊어지는 것도 고객이 브라우져를 닫는 순간 감지해낼수 있는가?
어떻게 생각하는가? 이론적으로도 가능할지 모르지만 실제는 불가능하다. http프로토콜의 특성을
알아야 하고 만약 숨김 애플릿같은 것으로 브라우져 이벤트를 감지하여, 서버측으로 보낸다 가정해도
당신이 직접 구현할 수 있는가?
그러면 어떻게 해야 할까? 결국 세션시간만료가 되어져 들어오는 이벤트를 감지하는 방법이 있겠지만
그렇게 한다면 세션타임아웃을 단기간으로 설정을 해야 할테고....
음, 여전히 문제로 남아있기는 하다. 그건 여러분들도 한번 생각해보시도록 하고.
사실 예전에 구현했던것은 한사람이 웹사이트에 중복으로 로그인을 하는 것을 방지하는 것을 만든적은
있다. 위의 리스너를 요리조리 이용해서 말이다. |
댓글
댓글 쓰기