기본 콘텐츠로 건너뛰기

keytool 사용법

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 사용방법

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프로토콜의 특성을
알아야 하고 만약 숨김 애플릿같은 것으로 브라우져 이벤트를 감지하여, 서버측으로 보낸다 가정해도
당신이 직접 구현할 수 있는가?

그러면 어떻게 해야 할까? 결국 세션시간만료가 되어져 들어오는 이벤트를 감지하는 방법이 있겠지만
그렇게 한다면 세션타임아웃을 단기간으로 설정을 해야 할테고....

음, 여전히 문제로 남아있기는 하다. 그건 여러분들도 한번 생각해보시도록 하고.
사실 예전에 구현했던것은 한사람이 웹사이트에 중복으로 로그인을 하는 것을 방지하는 것을 만든적은
있다. 위의 리스너를 요리조리 이용해서 말이다.

댓글

이 블로그의 인기 게시물

Jeus was jsp 컴파일된 파일 경로

WAS 구동시 jsp 에러가 났을때 jsp가 컴파일된 파일을 확인하여 디버깅한다. jeus was jsp 컴파일된 파일 경로 %WAS_HOME%/WEBAPP/WEB-INF/.warjspwork/jeus_jspwork/ jsp 에러의 예) javax.servlet.ServletException: String index out of range: -13 at javax.servlet.http.HttpServlet.service(Unknown Source) at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java(Compiled Code)) at jeus.servlet.engine.RequestDispatcherImpl.processCommonRequestDispatcher(RequestDispatcherImpl.java(Compiled Code)) at jeus.servlet.engine.RequestDispatcherImpl.doForward(RequestDispatcherImpl.java(Compiled Code)) at jeus.servlet.engine.RequestDispatcherImpl.forward(RequestDispatcherImpl.java(Compiled Code)) at com.tomato.jef.servlet.BaseServlet.doDispatch(BaseServlet.java(Inlined Compiled Code)) at com.tomato.jef.bizframe.servlet.XecureHTMLMainServlet.doProcess(XecureHTMLMainServlet.java(Compiled Code)) at com.tomato.jef.bizframe.servlet.XecureHTMLMainServlet.doSessionProcess(Xec...

Tomcat : context.xml 파일 사용

context.xml 파일을 사용하여 JNDI 등록 사용하는 방법 1. server.xml 파일에 JNDI 등록  server.xml 파일의 GlobalNamingResources노드에 Resource를 등록하고 Host 노드 하위 Context 노드에 ResourceLink노드를 등록하여 많이 사용했다. tomcat 5.5 이전 방식이다. server.xml ... <globalnamingresources>     <!-- Editable user database that can also be used by          UserDatabaseRealm to authenticate users     -->     <resource auth="Container" driverclassname="oracle.jdbc.OracleDriver" maxidle="4" maxtotal="8" name="global.db" password="password" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:xe" username="user">   </resource> </globalnamingresources> ... 2. context.xml 파일 분리 위 방식처럼 server.xml 파일에 모든 context의 정보를 추가하는 방식은 서버에 대한 제어권이 없으면 정보를 변경하기 힘들다. Tomcat 5.5? 이후부터는 context.xml 파일을 분리하여 webapplication에서 별도로 자원을 등록 사용할 수있도록 제공한다. META-INF/context.xml 파일을 위치시키면 Tomcat은 구동시 META-INF 폴더의 context.xml 파일을 ...

Vmware Fusion Window가 정상 종료가 되지 않을때

* 1번 방법   1. VMWare가 실행된 그 상태에서 Option키를 누르고 위에 메뉴바에서 Virtual Machine 메뉴를 클릭합니다.  2. 종료 메뉴가 Force 메뉴로 바뀌어 있습니다. Force shut down 이나 Force restart 합니다.  * 2번 방법   1. 유틸리티 - 활성 상태 보기로 들어가서 vmware 단어가 포함된 모든 프로세스를 강제종료 합니다.    2. 가상머신의 파일을 찾아갑니다. (eg. Documents/Virtual Machines/ 안에 있습니다.) 그리고 가상머신 파일의 오른쪽을 눌러 "패키지 내용 보기"로 들어갑니다.  3. ".vmem" 확장자로 된 모든 파일을 쓰레기통에 버리고 난 후 모두 비웁니다.  4. 다시 VMWare을 실행합니다. 어떤 오류가 나면 그냥 Disgard 하면됩니다.