728x90
반응형
[JSP] 19. 리스너
1. 리스너란?
-> 리스너는 특정 이벤트가 발생했을 때 이를 감지하고, 그에 대응하는 작업을 수행하는 자바 객체이다. 리스너는 서블릿 컨테이너에서 발생하는 다양한 이벤트를 처리할 수 있다.
2. 리스너를 사용하는 이유?
-> 리스너는 웹 애플리케이션의 상태 변화를 감지하여, 다음과 같은 작업을 수행할 수 있게 도와준다.
- 초기화 작업(애플리케이션 시작 시 필요한 리소스 로드)
- 정리 작업(애플리케이션 종료 시 리소스 해제)
- 세션 관련 작업(로그인/로그아웃 로깅, 세션 속성 변경 감지)
3. 주요 리스너 인터페이스
- ServletContextListener: 애플리케이션 시작 및 종료 이벤트를 처리한다.
- HttpSessionListener: 세션 생성 및 소멸 이벤트를 처리한다.
- ServletRequestListener: 요청 객체의 생성 및 소멸 이벤트를 처리한다.
4. 시나리오 코드
package com.tenco.listeners;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterRegistration;
import jakarta.servlet.FilterRegistration.Dynamic;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRegistration;
import jakarta.servlet.SessionCookieConfig;
import jakarta.servlet.SessionTrackingMode;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.descriptor.JspConfigDescriptor;
/*
* 리스너 사용해보기
* 동작 트리거, web.xml 파일과 어노테이션 기반으로 설정 가능
*/
@WebListener
public class AppLifecycleListener implements ServletContextListener{
private static final Logger logger=Logger.getLogger(AppLifecycleListener.class.getName());
// 애플리케이션이 언제 시작을 했는지 로그, 파일을 남겨야 될 때 사용
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("---------------------------");
logger.info("웹 애플리케이션 시작됨 >>>"+System.currentTimeMillis());
System.out.println("---------------------------");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("---------------------------");
logger.info("웹 애플리케이션 종료됨 >>>"+System.currentTimeMillis());
System.out.println("---------------------------");
}
}
package com.tenco.listeners;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterRegistration;
import jakarta.servlet.FilterRegistration.Dynamic;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRegistration;
import jakarta.servlet.SessionCookieConfig;
import jakarta.servlet.SessionTrackingMode;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.descriptor.JspConfigDescriptor;
/*
* 리스너 사용해보기
* 동작 트리거, web.xml 파일과 어노테이션 기반으로 설정 가능
*/
@WebListener
public class AppLifecycleListener implements ServletContextListener{
private static final Logger logger=Logger.getLogger(AppLifecycleListener.class.getName());
// 시간 포매터
private String timeFormat() {
// yyyy-mm-dd HH:mm:ss
Date nowtime=new Date();
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
String printTime=dateFormat.format(nowtime);
return printTime;
}
// 애플리케이션이 언제 시작을 했는지 로그, 파일을 남겨야 될 때 사용
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("---------------------------");
logger.info("웹 애플리케이션 시작됨 >>>"+timeFormat());
System.out.println("---------------------------");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("---------------------------");
logger.info("웹 애플리케이션 종료됨 >>>"+timeFormat());
System.out.println("---------------------------");
}
}
package com.tenco.listeners;
import java.util.logging.Logger;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
/*
* 세션이 생성될 때/감지할 때 사용! => 리스너 등록
*/
@WebListener
public class MySessionListener implements HttpSessionListener{
private static final Logger logger=
Logger.getLogger(MySessionListener.class.getName());
@Override
public void sessionCreated(HttpSessionEvent se) {
// 세션 생성 시 실행됨
logger.info("새로운 세션이 생성 됨 : "+se.getSession().getId());
se.getSession().setAttribute("LoginTime", System.currentTimeMillis());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 세션 소멸 시 실행됨
Long loginTime=(Long)se.getSession().getAttribute("LoginTime");
Long logoutTime=System.currentTimeMillis();
if(loginTime!=null) {
Long sessionDurationMs=logoutTime-loginTime; // 접속시간 계산 (밀리초 단위)
double sessionDurationMsSec=sessionDurationMs/1000; // 초 단위로 변환
System.out.println("세션 지속 시간 : "+sessionDurationMsSec);
}
}
}
package com.tenco.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/session-test")
public class SessionTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SessionTestServlet() {
}
// 주소 설계 - http://localhost:8080/fl/session-test
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 새로운 세션을 생성해보아용
HttpSession session = request.getSession();
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().print("당신의 세션 아이디는 : "+session.getId());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
728x90
반응형
'JSP > 기본 이론' 카테고리의 다른 글
[JSP] 22. JSP 라이프 사이클 (0) | 2024.07.03 |
---|---|
[JSP] 21. JSP의 개념과 역할 (0) | 2024.07.03 |
[JSP] 20. 세션과 리스너를 함께 사용하기 (0) | 2024.07.03 |
[JSP] 18. 필터를 사용해 특정 IP 차단시켜보기 (0) | 2024.07.03 |
[JSP] 17. 서블릿 필터와 리스너 (0) | 2024.07.03 |