カテゴリ: Servlet 更新日: 2025/10/08

Java ServletのHttpServletのgetLastModifiedメソッド完全ガイド!初心者でもわかるキャッシュ制御の基本

HttpServletのgetLastModifiedメソッド
HttpServletのgetLastModifiedメソッド

先生と生徒の会話形式で理解しよう

生徒

「JavaのServletで、ブラウザにキャッシュしてもらう方法ってありますか?」

先生

「はい、ありますよ。ServletのHttpServletクラスにあるgetLastModified()メソッドを使うことで、コンテンツが最後に更新された日時をブラウザに伝えることができます。」

生徒

「それってどうやって使うんですか?特別な設定が必要なんですか?」

先生

「では、getLastModified()メソッドの仕組みと使い方を一緒に見ていきましょう。」

1. getLastModifiedメソッドとは

1. getLastModifiedメソッドとは
1. getLastModifiedメソッドとは

getLastModified()メソッドは、Java ServletのHttpServletクラスに用意されている保護されたメソッドで、ブラウザがキャッシュを活用できるように、レスポンスの「最終更新日時(Last-Modified)」を指定するために使用されます。

このメソッドをオーバーライドすることで、Servletが管理するリソースが最後に変更された時刻をブラウザに伝えることができ、HTTPのキャッシュ制御機能が有効になります。

2. なぜgetLastModifiedが重要なのか

2. なぜgetLastModifiedが重要なのか
2. なぜgetLastModifiedが重要なのか

Webアプリケーションでは、同じコンテンツに何度もアクセスがあると、毎回サーバーからレスポンスを返すのは非効率です。getLastModified()を使えば、ブラウザがキャッシュを使えるかどうかを判断するための「更新日時」を返すことができ、効率的な通信が可能になります。

特に、画像やCSS、JavaScriptのような頻繁に変更されないファイルに対して効果的で、サーバー負荷の軽減とレスポンス速度の向上が期待できます。

3. getLastModifiedの基本的な使い方

3. getLastModifiedの基本的な使い方
3. getLastModifiedの基本的な使い方

HttpServletクラスを継承したServletで、getLastModified()メソッドをオーバーライドして、リソースの最終更新時刻(エポックミリ秒)を返します。


import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

public class MyCacheServlet extends HttpServlet {
    @Override
    protected long getLastModified(HttpServletRequest req) {
        // ここでは固定値を返していますが、実際にはファイルの更新日時などを使う
        return System.currentTimeMillis() - 1000 * 60 * 60; // 1時間前
    }
}

このように書くことで、ServletコンテナはdoGet()メソッドを呼び出す前にgetLastModified()を実行し、条件付きリクエスト(If-Modified-Sinceヘッダー)に対応します。

4. HTTPのIf-Modified-Sinceと連携する仕組み

4. HTTPのIf-Modified-Sinceと連携する仕組み
4. HTTPのIf-Modified-Sinceと連携する仕組み

ブラウザが再度同じURLにアクセスしたとき、If-Modified-Sinceヘッダーを含めてリクエストを送信します。

サーバー側のgetLastModified()が返す値が、その日時よりも古ければ、サーバーはHTTPステータスコード304 Not Modifiedを返して、キャッシュを利用するようブラウザに指示します。

この仕組みによって、無駄なデータ送信が行われず、通信効率が大幅に向上します。

5. 実践的な使用例:ファイルの更新日を返す

5. 実践的な使用例:ファイルの更新日を返す
5. 実践的な使用例:ファイルの更新日を返す

次の例では、サーバー上のファイルの最終更新日時を取得し、それをgetLastModified()で返すようにしています。


import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.File;

public class FileServlet extends HttpServlet {
    @Override
    protected long getLastModified(HttpServletRequest req) {
        String path = getServletContext().getRealPath("/data/info.txt");
        File file = new File(path);
        return file.lastModified(); // ファイルの最終更新日時を返す
    }
}

このように、実際のファイルの更新日時を返すことで、ブラウザ側でキャッシュの有効性が高まり、レスポンスが高速になります。

6. getLastModifiedの注意点と制限

6. getLastModifiedの注意点と制限
6. getLastModifiedの注意点と制限

getLastModified()が機能するのは、HTTPのGETメソッドでアクセスされたときだけです。POSTリクエストや他のメソッドでは無視されるため、使い方には注意が必要です。

また、getLastModified()が-1を返すと、Servletコンテナはキャッシュを無効と判断し、毎回doGet()を実行します。そのため、適切な日時を返すことが大切です。

7. キャッシュ制御とパフォーマンス最適化

7. キャッシュ制御とパフォーマンス最適化
7. キャッシュ制御とパフォーマンス最適化

getLastModified()を活用することで、HTTPキャッシュ制御をより細かく管理できるようになります。

これにより、クライアント側のパフォーマンス向上、サーバー側の負荷軽減、通信量の削減といった多くのメリットが得られます。

特にトラフィックの多いシステムや、静的リソースの多いWebアプリケーションでは、パフォーマンスチューニングの鍵となる重要なメソッドです。

関連記事:
カテゴリの一覧へ
新着記事
Javaのラムダ式で戻り値とvoidの使い方を解説!returnの書き方も完全理解
Javaのメソッド参照とコンストラクタ参照の使い方を完全ガイド!初心者向けに::とClass::newを解説
Javaのラムダ式の書き方を徹底解説!アロー演算子->の基本と使い方
Thymeleafのth:eachの使い方!ループ回数やindexなどの繰り返し処理を学ぼう
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring Boot JPA入門:エンティティ/リポジトリの基本と作り方
No.3
Java&Spring記事人気No3
Javaの@Validアノテーションを徹底解説!初心者でもわかる入力値検証の基本
No.4
Java&Spring記事人気No4
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス