[Web] 리스너 / HttpSessionBindingListener 접속자 표시 / HttpSessionListener 로그인 접속자수 표시

2024. 8. 21. 20:49자바 웹 개발/세션 쿠키 필터 리스너

자바 GUI는 이벤트 핸들러를 이용해 화면 기능을 구현한다. 서블릿에서도 이벤트를 추러히는 여러 리스너를 제공한다. 

Listener 추상 메서드 기능
ServletContextAttributeListener AttributeAdded()
AttributeRemoved()
AttributeReplaced()
Context 객체에 속성 추가/제거/수정 이벤트 발생 시 처리합니다. 
HttpSessionListener sessionCreated()
sessionDestroyed()
세션 객체의 생성/소멸 이벤트 발생 시 처리합니다
ServletRequestListener requestInitialized()
requestDestroyed()
클라이언트의 요청 이벤트 발생 시 처리합니다
ServletRequestAttributeListener AttributedAdded()
AttributedRemoved()
AttributeReplaced()
요청 객체에 속성 추가/제거/수정 이벤트 발생 시 처리합니다
HttpSessionBindingListener valueBound()
valueUnbound()
세션에 바인딩/언바인딩된 객체를 알려주는 이벤트 발생 시 처리합니다
HttpSessionAttributeListener attributedAdded()
attributedRemoved()
attributeReplaced()
세션에 속성 추가/제거/수정 이벤트 발생 시 처리합니다
ServletContextListener contextInitialized()
contextDestroyed()
컨텍스트 객체의 생성/소멸 이벤트 발생 시 처리합니다
HttpSessionActivationListener sessionDidActivate()
sessionWillPassivate()
세션의 활성화/비활성화 이벤트 발생시 처리합니다. 

 

HttpSessionBindingListener 접속자 표시

HttpSessionBindingListener를 통해 접속자 표시를 해보자. 

 

@WebServlet("/login")
public class LoginTest extends HttpServlet{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		request.setCharacterEncoding("utf-8");
//		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		HttpSession session = req.getSession();
		String user_id = req.getParameter("user_id");
		String user_pw = req.getParameter("user_pw");
		LoginImpl loginUser = new LoginImpl(user_id, user_pw); // 이벤트 핸들러 생성 후 세션에 저장
		if(session.isNew()) {
			session.setAttribute("loginUser", loginUser); //세션에 바인딩 시 LoginImpl의 valueBound() 메서드 호출
		}
		
		out.println("<head>");
		out.println("<script type='text/javascript'>");
		out.println("setTimeout('history.go(0);', 5000"); //자바스크립트 setTimeout() 함수를 이용해 5초마다 서블릿에 재요청
		out.println("</script>");
		out.println("</head>");
		out.println("<html><body>");
		out.println("아이디는 " + loginUser.user_id + "<br>");
		out.println("총 접속자수는 " + LoginImpl.total_user + "<br>");
		out.println("</body></html>");
	}

}

 

아래는 바인딩 이벤트를 처리하는 이벤트 핸들러가 구현되어 있다. 세션에 바인딩 시 total_user 값을 증가시킨다. 

public class LoginImpl implements HttpSessionBindingListener{
	String user_id;
	String user_pw;
	static int total_user =0;
	public LoginImpl() {
		
	}
	
	public LoginImpl(String user_id, String user_pw) {
		this.user_id = user_id;
		this.user_pw = user_pw;
	}
	
	@Override
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("사용자 접속");
		++total_user;
	}
	
	@Override
	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("사용자 접속 해제");
		total_user--;
	}
}

 

HttpSessionListener 로그인 접속자수 표시

@WebServlet("/login")
public class LoginTest extends HttpServlet{
	ServletContext context = null;
	List user_list = new ArrayList();
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		request.setCharacterEncoding("utf-8");
//		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		context=getServletContext();
		HttpSession session = req.getSession();
		String user_id = req.getParameter("user_id");
		String user_pw = req.getParameter("user_pw");
		LoginImpl loginUser = new LoginImpl(user_id, user_pw);
		if(session.isNew()) {
			session.setAttribute("loginUser", loginUser);
			user_list.add(user_id);
			context.setAttribute("user_list", user_list);
		}
		
		out.println("<html><body>");
		out.println("아이디는 " + LoginImpl.total_user+ "<br><br>");
		out.println("접속 아이디:<br>");
		List list = (ArrayList)context.getAttribute("user_list");
		for(int i = 0; i<list.size(); i++) {
			out.println(list.get(i)+"<br>");
		}
		out.println("<a href='logout?user_id="+ user_id +"'>로그아웃 </a>");
		out.println("</body></html>");
	}

}

 

@WebServlet("/logout")
public class LogoutTest extends HttpServlet{
	ServletContext context;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doHandle(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doHandle(req,resp);
	}
	
	private void doHandle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		context=getServletContext();
		PrintWriter out = resp.getWriter();
		HttpSession session = req.getSession();
		String user_id = req.getParameter("user_id");
		session.invalidate();
		ArrayList user_list = (ArrayList) context.getAttribute("user_list");
		user_list.remove(user_id);
		context.removeAttribute("user_list");
		context.setAttribute("user_list", user_list);
		out.println("<br>로그아웃했습니다.");
	}
}

 

@WebListener
public class LoginImpl implements HttpSessionListener {
	String user_id;
	String user_pw;
	static int total_user=0;

    public LoginImpl() {
      
    }
    
    public LoginImpl(String user_id, String user_pw) {
        this.user_id = user_id;
        this.user_pw = user_pw;
        
    }

    public void sessionDestroyed(HttpSessionEvent arg0)  { 
         System.out.println("세션 소멸");
         --total_user;
    }

	public void sessionCreated(HttpSessionEvent arg0)  { 
		System.out.println("세션 생성");
        ++total_user;
    }
	
}