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

🎯 과제
이 프로젝트에서 다음을 배우게 됩니다:
- IP 주소와 방문 횟수를 표시하기 위해
index.jsp파일을 구현하는 방법. ServletContext에서ipVisitMap을 생성하고 저장하기 위해MyListener클래스를 구현하는 방법.- 각 IP 주소의 방문 횟수를 계산하고
ipVisitMap을 업데이트하기 위해MyFilter클래스를 구현하는 방법.
🏆 성과
이 프로젝트를 완료하면 다음을 수행할 수 있습니다:
- Java Servlet 과 JSP 를 사용하여 간단한 웹 애플리케이션을 구축합니다.
ServletContext를 사용하여 애플리케이션 수준 데이터를 저장하고 검색합니다.Filter를 사용하여 들어오는 요청을 가로채 처리합니다.- 동기화를 사용하여 공유 리소스에 대한 스레드 안전한 접근을 보장합니다.
index.jsp 파일 구현
이 단계에서는 IP 주소와 방문 횟수를 표시하기 위해 index.jsp 파일을 구현하는 방법을 배웁니다.
/home/labex/project/IpProject/src/main/webapp디렉토리에 있는index.jsp파일을 엽니다.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 클래스를 구현하는 방법을 배웁니다.
/home/labex/project/IpProject/src/main/java/org/labex/listener디렉토리에 있는MyListener.java파일을 엽니다.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 클래스를 구현하는 방법을 배웁니다.
/home/labex/project/IpProject/src/main/java/org/labex/filter디렉토리에 있는MyFilter.java파일을 엽니다.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에 대한 업데이트가 스레드 안전하도록 보장합니다.
애플리케이션 테스트
터미널을 열고
/home/labex/project/IpProject디렉토리로 이동합니다.다음 명령을 실행하여 Tomcat 서버를 시작합니다:
mvn tomcat7:run
웹 브라우저를 열고
http://127.0.0.1:8080으로 이동합니다. IP 주소와 방문 횟수가 표시된 IP 방문자 추적기 페이지가 표시되어야 합니다.방문 횟수가 증가하는 것을 확인하기 위해 페이지를 여러 번 새로 고칩니다.

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



