IP アドレスによるアクセス回数のカウント

JavaBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、Java Servlet と JSP を使って簡単な IP 訪問者追跡アプリケーションを構築する方法を学びます。このアプリケーションは、ウェブサイトにアクセスする訪問者の IP アドレスと、各 IP アドレスの訪問回数を追跡します。

プレビュー

プロジェクトのプレビュー

🎯 タスク

このプロジェクトでは、以下のことを学びます。

  • index.jspファイルを実装して、IP アドレスとその訪問回数を表示する方法。
  • MyListenerクラスを実装して、ServletContextipVisitMapを作成して保存する方法。
  • MyFilterクラスを実装して、各 IP アドレスの訪問回数をカウントしてipVisitMapを更新する方法。

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • 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 クラスを実装する

このステップでは、MyListenerクラスをどのように実装するか学びます。このクラスは、ipVisitMapを作成してServletContextに保存します。

  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) {
        // 必要に応じてクリーンアップコードを記述する
    }
}

このコードは、IP アドレスとその訪問回数を保存するための新しい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 {
        // 必要に応じて初期化コードを記述する
    }

    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 アドレスを取得してから、それに応じてipVisitMapを更新します。synchronizedブロックは、ipVisitMapへの更新がスレッドセーフであることを保証します。

アプリケーションをテストする

  1. ターミナルを開き、/home/labex/project/IpProject ディレクトリに移動します。

  2. 以下のコマンドを実行して Tomcat サーバーを起動します。

mvn tomcat7:run
  1. ウェブブラウザを開き、http://127.0.0.1:8080 に移動します。IP アドレスとその訪問回数が表示された IP 訪問者トラッカーページが表示されるはずです。

  2. ページを何度か更新して、訪問回数が増えることを確認します。

プロジェクトの結果

まとめ

おめでとうございます!このプロジェクトを完了しました。実力を向上させるために、LabEx でさらに多くの実験を行って練習してください。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習