按 IP 统计访问次数

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何使用 Java Servlet 和 JSP 构建一个简单的 IP 访客跟踪应用程序。该应用程序将跟踪访问网站的访客的 IP 地址以及每个 IP 地址的访问次数。

预览

项目预览

🎯 任务

在这个项目中,你将学习:

  • 如何实现 index.jsp 文件以显示 IP 地址及其访问计数。
  • 如何实现 MyListener 类以在 ServletContext 中创建并存储 ipVisitMap
  • 如何实现 MyFilter 类以统计每个 IP 地址的访问次数并更新 ipVisitMap

🏆 成果

完成这个项目后,你将能够:

  • 使用 Java Servlet 和 JSP 构建一个简单的 Web 应用程序。
  • 使用 ServletContext 存储和检索应用程序级别的数据。
  • 使用 Filter 拦截并处理传入的请求。
  • 使用同步来确保对共享资源的线程安全访问。

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("`Java`")) -.-> java/DataStructuresGroup(["`Data Structures`"]) java(("`Java`")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["`Object-Oriented and Advanced Concepts`"]) java(("`Java`")) -.-> java/FileandIOManagementGroup(["`File and I/O Management`"]) java(("`Java`")) -.-> java/ConcurrentandNetworkProgrammingGroup(["`Concurrent and Network Programming`"]) java(("`Java`")) -.-> java/SystemandDataProcessingGroup(["`System and Data Processing`"]) java/DataStructuresGroup -.-> java/collections_methods("`Collections Methods`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("`Classes/Objects`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashmap("`HashMap`") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/annotation("`Annotation`") java/FileandIOManagementGroup -.-> java/io("`IO`") java/ConcurrentandNetworkProgrammingGroup -.-> java/threads("`Threads`") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("`Working`") java/ConcurrentandNetworkProgrammingGroup -.-> java/net("`Net`") java/SystemandDataProcessingGroup -.-> java/string_methods("`String Methods`") subgraph Lab Skills java/collections_methods -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/classes_objects -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/hashmap -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/annotation -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/io -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/threads -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/working -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/net -.-> lab-300352{{"`按 IP 统计访问次数`"}} java/string_methods -.-> lab-300352{{"`按 IP 统计访问次数`"}} end

实现 index.jsp 文件

在这一步中,你将学习如何实现 index.jsp 文件以显示 IP 地址及其访问计数。

  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 访客跟踪器</title>
</head>
<body>
<h1>IP 访客跟踪器</h1>
<table border="1">
    <tr>
        <th>IP 地址</th>
        <th>访问计数</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 类

在这一步中,你将学习如何实现 MyListener 类,以便在 ServletContext 中创建并存储 ipVisitMap

  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) {
        // 如有需要,进行清理代码
    }
}

这段代码创建了一个名为 ipVisitMap 的新 HashMap,用于存储 IP 地址及其访问计数,然后将其设置为 ServletContext 的一个属性。

✨ 查看解决方案并练习

实现 MyFilter 类

在这一步中,你将学习如何实现 MyFilter 类,以统计每个 IP 地址的访问次数并更新 ipVisitMap

  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 {
        // 如有需要,进行初始化代码
    }

    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() {
        // 如有需要,进行清理代码
    }
}

这段代码从 ServletContext 中获取 ipVisitMap,获取当前客户端的 IP 地址,然后相应地更新 ipVisitMapsynchronized 块确保对 ipVisitMap 的更新是线程安全的。

✨ 查看解决方案并练习

测试应用程序

  1. 打开一个终端,并导航到 /home/labex/project/IpProject 目录。

  2. 通过运行以下命令启动 Tomcat 服务器:

mvn tomcat7:run
  1. 打开一个网页浏览器,并导航到 http://127.0.0.1:8080。你应该会看到显示 IP 地址及其访问计数的 IP 访客跟踪器页面。

  2. 多次刷新页面,以查看访问计数增加。

项目结果
✨ 查看解决方案并练习

总结

恭喜!你已完成此项目。你可以在 LabEx 中练习更多实验以提升你的技能。

您可能感兴趣的其他 Java 教程