JavaのHttpServletRequestWrapperのgetDateHeaderの使い方を完全解説!初心者でもわかるHTTPヘッダーの日付取得方法
生徒
「JavaのServletで、リクエストヘッダーから日付情報を取得する方法ってあるんですか?」
先生
「はい、HttpServletRequestWrapperクラスのgetDateHeader()メソッドを使えば、HTTPヘッダーに含まれる日付を簡単に取得できますよ。」
生徒
「日付ってどんな形式で返ってくるんですか?」
先生
「UNIX時間(ミリ秒)で返ってくるので、JavaのDateクラスと組み合わせて使うのが一般的ですね。」
1. getDateHeaderメソッドとは
getDateHeader()メソッドは、HTTPリクエストのヘッダーから指定された名前のヘッダー値を日時として取得するためのメソッドです。
このメソッドは、指定されたヘッダーの値をlong型のエポックミリ秒として返します。取得した値はjava.util.Dateに変換して使うことが一般的です。
もしヘッダーが存在しない場合は-1が返され、フォーマットが無効な場合はIllegalArgumentExceptionがスローされます。
2. getDateHeaderの使い方
以下のコードは、"If-Modified-Since"というリクエストヘッダーから日時情報を取得して表示する例です。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Date;
public class DateHeaderWrapper extends HttpServletRequestWrapper {
public DateHeaderWrapper(HttpServletRequest request) {
super(request);
}
public void printDateHeader() {
long dateMillis = getDateHeader("If-Modified-Since");
if (dateMillis != -1) {
Date date = new Date(dateMillis);
System.out.println("If-Modified-Since: " + date);
} else {
System.out.println("ヘッダーが存在しません。");
}
}
}
このように、取得したUNIX時間をDateに変換して扱います。
3. よく使われる日付系HTTPヘッダー
getDateHeader()を使って取得される代表的なHTTPヘッダーには以下のようなものがあります。
- If-Modified-Since:キャッシュが有効かどうかを判断するための日時
- If-Unmodified-Since:変更がない場合にのみ処理を行う
- Date:リクエストの作成日時(通常はレスポンス用)
特にキャッシュ制御や条件付きリクエストにおいて、日付情報は重要な役割を果たします。
4. getDateHeaderを使う上での注意点
getDateHeader()で取得できる日時は、HTTPヘッダー内で定義された形式に従っていないと例外が発生します。RFC 1123形式である必要があるため、必ず信頼できるリクエストのみを処理するようにしましょう。
また、存在しない場合に-1が返されるため、必ず条件分岐でのチェックが必要です。
5. 実用例:条件付きGET処理
たとえば、If-Modified-Sinceヘッダーを使って、リソースが変更されていない場合には304 Not Modifiedを返すような処理が可能です。
long ifModifiedSince = request.getDateHeader("If-Modified-Since");
if (ifModifiedSince != -1 && resourceLastModified <= ifModifiedSince) {
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
これにより、無駄なデータ転送を避け、パフォーマンスの向上と帯域の節約に繋がります。