IP 주소별 방문 횟수 집계

JavaBeginner
지금 연습하기

소개

이 프로젝트에서는 Java Servlet 과 JSP 를 사용하여 간단한 IP 방문자 추적 애플리케이션을 구축하는 방법을 배웁니다. 이 애플리케이션은 웹사이트에 접속하는 방문자의 IP 주소와 각 IP 주소의 방문 횟수를 추적합니다.

미리보기

project preview

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다:

  • IP 주소와 방문 횟수를 표시하기 위해 index.jsp 파일을 구현하는 방법.
  • ServletContext에서 ipVisitMap을 생성하고 저장하기 위해 MyListener 클래스를 구현하는 방법.
  • 각 IP 주소의 방문 횟수를 계산하고 ipVisitMap을 업데이트하기 위해 MyFilter 클래스를 구현하는 방법.

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • Java Servlet 과 JSP 를 사용하여 간단한 웹 애플리케이션을 구축합니다.
  • ServletContext를 사용하여 애플리케이션 수준 데이터를 저장하고 검색합니다.
  • Filter를 사용하여 들어오는 요청을 가로채 처리합니다.
  • 동기화를 사용하여 공유 리소스에 대한 스레드 안전한 접근을 보장합니다.

index.jsp 파일 구현

이 단계에서는 IP 주소와 방문 횟수를 표시하기 위해 index.jsp 파일을 구현하는 방법을 배웁니다.

  1. /home/labex/project/IpProject/src/main/webapp 디렉토리에 있는 index.jsp 파일을 엽니다.

  2. index.jsp 파일에 다음 코드를 추가합니다:

<%@ page import="java.util.Map" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>IP Visitor Tracker</title>
</head>
<body>
<h1>IP Visitor Tracker</h1>
<table border="1">
    <tr>
        <th>IP Address</th>
        <th>Visit Count</th>
    </tr>
    <%
        Map<String, Integer> ipVisitMap = (Map<String, Integer>) getServletContext().getAttribute("ipVisitMap");
        if (ipVisitMap != null) {
            for (String ip : ipVisitMap.keySet()) {
    %>
    <tr>
        <td><%= ip %></td>
        <td><%= ipVisitMap.get(ip) %></td>
    </tr>
    <%
            }
        }
    %>
</table>
</body>
</html>

이 코드는 ServletContext에서 ipVisitMap을 가져와 IP 주소와 방문 횟수를 테이블에 표시합니다.

MyListener 클래스 구현

이 단계에서는 ServletContext에서 ipVisitMap을 생성하고 저장하기 위해 MyListener 클래스를 구현하는 방법을 배웁니다.

  1. /home/labex/project/IpProject/src/main/java/org/labex/listener 디렉토리에 있는 MyListener.java 파일을 엽니다.

  2. MyListener 클래스에 다음 코드를 추가합니다:

package org.labex.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.HashMap;
import java.util.Map;

@WebListener
public class MyListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        Map<String, Integer> ipVisitMap = new HashMap<>();
        servletContext.setAttribute("ipVisitMap", ipVisitMap);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        // Cleanup code if needed
    }
}

이 코드는 IP 주소와 방문 횟수를 저장하기 위해 ipVisitMap이라는 새로운 HashMap을 생성한 다음, 이를 ServletContext의 속성으로 설정합니다.

MyFilter 클래스 구현

이 단계에서는 각 IP 주소의 방문 횟수를 계산하고 ipVisitMap을 업데이트하기 위해 MyFilter 클래스를 구현하는 방법을 배웁니다.

  1. /home/labex/project/IpProject/src/main/java/org/labex/filter 디렉토리에 있는 MyFilter.java 파일을 엽니다.

  2. MyFilter 클래스에 다음 코드를 추가합니다:

package org.labex.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;

@WebFilter("/*")
public class MyFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        // Initialization code if needed
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String ipAddress = httpRequest.getRemoteAddr();
        ServletContext servletContext = httpRequest.getServletContext();
        Map<String, Integer> ipVisitMap = (Map<String, Integer>) servletContext.getAttribute("ipVisitMap");

        synchronized (ipVisitMap) {
            if (ipVisitMap.containsKey(ipAddress)) {
                ipVisitMap.put(ipAddress, ipVisitMap.get(ipAddress) + 1);
            } else {
                ipVisitMap.put(ipAddress, 1);
            }
        }

        chain.doFilter(request, response);
    }

    public void destroy() {
        // Cleanup code if needed
    }
}

이 코드는 ServletContext에서 ipVisitMap을 가져오고, 현재 클라이언트의 IP 주소를 얻은 다음, 그에 따라 ipVisitMap을 업데이트합니다. synchronized 블록은 ipVisitMap에 대한 업데이트가 스레드 안전하도록 보장합니다.

애플리케이션 테스트

  1. 터미널을 열고 /home/labex/project/IpProject 디렉토리로 이동합니다.

  2. 다음 명령을 실행하여 Tomcat 서버를 시작합니다:

mvn tomcat7:run
  1. 웹 브라우저를 열고 http://127.0.0.1:8080으로 이동합니다. IP 주소와 방문 횟수가 표시된 IP 방문자 추적기 페이지가 표시되어야 합니다.

  2. 방문 횟수가 증가하는 것을 확인하기 위해 페이지를 여러 번 새로 고칩니다.

project result

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습