[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;
}
}
'자바 웹 개발 > 세션 쿠키 필터 리스너' 카테고리의 다른 글
[Web] 필터 (0) | 2024.08.21 |
---|---|
[Web] 서블릿 URL 패턴 (0) | 2024.08.21 |
[Web] 서블릿 속성과 스코프 (0) | 2024.08.21 |
[Web] encodeURL 사용 (0) | 2024.08.19 |
[Web] 세션을 이용한 로그인 정보 바인딩하기 (0) | 2024.08.19 |