[국비학원 기록/Servlet] 서블릿 리스너(Listener), 로그인 접속자 수 카운트
my code archive
article thumbnail
반응형

<리스너를 알기 위해 정리해야 할 개념>

-리스너

-이벤트

 

=>리스너는 이벤트가 발생함과 동시에 특정 행동 (메서드나 함수 실행)을 하는 것,

    이것을 이벤트 핸들링이라고 한다.

=>이벤트는 발생한 특정 행동을 말한다. ex) 마우스 클릭, 키보드 키 입력, 텍스트 입력 ...

 

리스너(Listener)

이벤트가 발생하기를 기다리는 (청취하는) 컴포넌트(함수나 객체)를 말한다.

Java에서 리스너는 객체가 되고 특정 이벤트가 발생했을 때 실행될 메서드를 가지고 있다.

 

리스너 API

 

HttpSessionBindingListener implements 받아 로그인 접속자 수 카운트하기
우클릭 - Listener 클릭하여 생성

 

login2.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인</title>
</head>
<body>
    <form name="frmLogin" action="login3" method="post" enctype="utf-8">
        이름 : <input type="text" name="user_name"><br>
        비밀번호 : <input type="password" name="user_pw"><br>
        <input type="submit" value="로그인">
        <input type="reset" value="다시 입력">
    </form>
</body>
</html>
cs

 

LoginTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet("/login3")
public class LoginTest extends HttpServlet {
 
    ServletContext context = null;
    List userList = new ArrayList();        //로그인한 접속자 ID를 저장하는 ArrayList 추가
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        context = getServletContext();
        HttpSession session = request.getSession();
        
        String user_name = request.getParameter("user_name");
        String user_pw = request.getParameter("user_pw");
        
        //LoginImple 객체 생성한 후 전송된 ID와 비밀번호를 저장함.
        LoginImple loginUser = new LoginImple(user_name, user_pw);
        
        //최초 로그인 시(isNew == true) 접속자 ID를 userList(ArrayList)에 차례로 저장한 후
        //다시 context 객체에 속성으로 저장함.
        if(session.isNew()) {
            session.setAttribute("loginUser", loginUser);
            userList.add(user_name);
            context.setAttribute("userList", userList);
        }
        
        out.print("<html><head>");
        out.print("<body>");
        out.print("아이디는 "+loginUser.user_id+"<br>");
        out.print("총 접속자 수는" + LoginImple.total_user+"<br>");        //접속자 수를 브라우저로 출력.
        out.print("접속 아이디 : <br>");
        //context 객체의 ArrayList를 가져와
        //접속자 ID를 차례대로 브라우저에 출력함.
        List list = (ArrayList) context.getAttribute("userList");
        for(int i=0;i<list.size();i++) {
            out.print(list.get(i) + "<br>");
        }
        //로그아웃 클릭 시 서블릿 logout으로 접속자 ID를 전송해 로그아웃함.
        out.print("<a href='logout?user_id=" +user_name+"'>[로그아웃]</a>");
        out.print("</body>");
        out.print("</head></html>");
        
    }
}
cs

 

LoginImple (리스너)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
/**
 * Application Lifecycle Listener implementation class LoginImple
 *
 */
@WebListener            //애너테이션으로 리스너가 등록된 것임.
public class LoginImple implements HttpSessionListener {
    
    String user_id;
    String user_pw;
    static int total_user=0;
 
    /**
     * Default constructor. 
     */
    public LoginImple() {
        // TODO Auto-generated constructor stub
    }
    
    public LoginImple(String user_id, String user_pw) {
        super();
        this.user_id = user_id;
        this.user_pw = user_pw;
    }
 
    /**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     * 세션 생성 시 이벤트 처리함.
     */
    public void sessionCreated(HttpSessionEvent se)  { 
        System.out.println("세션 생성");
        ++total_user;        //세션 생성 시 접속자 수를 1 증가시킴.
    }
 
    /**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent se)  { 
        System.out.println("세션 소멸");
        --total_user;        //세션 소멸 시 접속자 수를 1 감소시킴.
    }
    
}
 
cs

 

Logout.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.awt.desktop.UserSessionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet("/logout")
public class LogoutTest extends HttpServlet {
    
    ServletContext context = null;
    List userList = new ArrayList();
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request, response);
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doHandle(request, response);
    }
    
    private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        context = getServletContext();
        HttpSession session = request.getSession();
        
        String urse_id = request.getParameter("user_id");    //userList에서 삭제할 아이디를 가져옴.
        session.invalidate();                                //로그아웃 시 세션을 소멸시킴.
        //userList에서 로그아웃한 접속한 ID를 삭제한 후
        //다시 userList를 컨텍스트에 저장함.
        List list = (ArrayList)context.getAttribute("userList");
        userList.remove(urse_id);
        context.removeAttribute("userList");
        context.setAttribute("userList", userList);
        out.print("<br>로그아웃했습니다.");
    }
 
    
}
cs

 

<실행 화면>

접속자 수 1 증가

다른 브라우저(파이어폭스)에서 로그인해도

접속자 수 1증가 (1 -> 2)

로그아웃 해보면

다시 줄어듦!! (2->1)
반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형