프밍일기

리스너를 이용한 세션 변경 감지 본문

Servlet

리스너를 이용한 세션 변경 감지

스에조theLED 2017. 4. 9. 16:38

자바EE에는 세션의 변경에 대응할 수 있도록 세션 이벤트 라는 개념이 있다. 해당 리스너를 추가하면 세션에 변경이 있을때 마다 변경 종류에 해당하는 이벤트 핸들러가 호출되어 적절한 처리를 할 수 있다. 이러한 리스너를 등록하는 방법에는 배포 기술자(web.xml)에 <listener>구성을 추가하는 방법과 @WebListener 어노테이션을 지정하는 방법이 있다.


■ 배포 기술자를 이용한 리스너 등록

# web.xml에 다음 내용 추가


<web-app>

......

<listener>

<listener-class>com.sample.servlet.SessionListener</listener-class>

</listener>

......

</web-app>



■ 어노테이션을 이용한 리스너 등록

# 리스너 클래스 처음에 @WebListener 추가


@WebListener

public class SessionListener implements HttpSessionListener, HttpSessionIdListener, HttpSessionAttributeListener {

......

}



■ 사용예제

# Listener Class

@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionIdListener, HttpSessionAttributeListener {
	
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// 세션 생성시 호출
		System.out.println("[ session ] created / id : " + se.getSession().getId());
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// 세션 소멸시 호출
		System.out.println("[ session ] destroyed / id : " + se.getSession().getId());
	}

	@Override
	public void sessionIdChanged(HttpSessionEvent se, String oldSessionId) {
		// 세션ID 변경시 호출
		System.out.println("[ session ] changed / oldId : " + oldSessionId + " / newId : " + se.getSession().getId());
	}

	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		// 프라퍼티 추가시 호출
		System.out.println("[ session ] add / key : " + se.getName() + ", value : " + se.getValue());
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		// 프라퍼티 삭제시 호출
		System.out.println("[ session ] remove / key : " + se.getName());
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		// 프라퍼티 값 변경시 호출
		System.out.println("[ session ] replace / key : " + se.getName() + ", value : " + se.getValue() + " --> " +  se.getSession().getAttribute(se.getName()));
	}
}


# 세션을 사용하는 Servlet Class

@WebServlet(
	name = "helloServlet",
	urlPatterns = {"/greeting"},
	loadOnStartup = 1
)
public class HelloServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		String param1 = req.getParameter("param1").trim();
		String name = req.getParameter("name").trim();
		String value = req.getParameter("value").trim();
		System.out.println("[ req.parameters ] command : " + param1 + " / key : " + name + " / value : " + value);
		
		HttpSession sess = req.getSession();
		
		if ("inq".equals(param1)) {
			System.out.println("[ inquery ] " + name + " : " + sess.getAttribute(name));
		} else if ("add".equals(param1)) {
			sess.setAttribute(name, value);
		} else if ("rem".equals(param1)) {
			sess.removeAttribute(name);
		}
		
		resp.getWriter().println("<script type='text/javascript'>history.back();</script>");
	}
}


# 테스트 HTML

<form id="form1" name="form1" method="post">
	<input id="name" name="name" type="text" />
	<input id="value" name="value" type="text" />
	<input id="param1" name = "param1" type="hidden" />
	<br /><br />
	<input id="button1" name="button1" type="button" value="세션조회" onclick="javascript:sessionControl('inq');" />
	<input id="button2" name="button2" type="button" value="세션추가" onclick="javascript:sessionControl('add');" />
	<input id="button3" name="button3" type="button" value="세션삭제" onclick="javascript:sessionControl('rem');" />
</form>
<script type="text/javascript">
function sessionControl(gbn) {
	form1.param1.value = gbn;
	form1.action = "http://localhost:8080/ServletSample/greeting";
	form1.submit();
}
</script>


# TEST Action

1. name / jack 으로 [세션추가]

2. name / eric 으로 [세션추가]

3. name 으로 [세션조회]

4. name 으로 [세션삭제]

5. name 으로 [세션조회]


# 결과


1. [ req.parameters ] command : add / key : name / value : jack

1. [ session ] created / id : 23A39776FE01C3BA0B914F5448AE2F5E

1. [ session ] add / key : name, value : jack

2. [ req.parameters ] command : add / key : name / value : eric

2. [ session ] replace / key : name, value : jack --> eric

3. [ req.parameters ] command : inq / key : name / value : 

3. [ inquery ] name : eric

4. [ req.parameters ] command : rem / key : name / value : 

4. [ session ] remove / key : name

5. [ req.parameters ] command : inq / key : name / value : 

5. [ inquery ] name : null




Comments