Web系開発メモ

Java, JavaScript, CSS, HTML などの記事を書いています。

ServletRequestListener:リクエストの前後処理

ServletRequestListener を使うと、サーブレット(or フィルタ)の処理前後に通知を受けることができます。

前提

記事内のコードを実行するには、サーブレットの動作環境(コンテナ)が必要になります。環境がない場合は、下の記事などを参照して頂けると嬉しいです。

Servlet:動作環境構築(Jetty Maven Plugin)

手順1. リスナーの作成

ServletRequestListener を実装するリスナーを作成します。

ssjp/src/main/java/ssjp/listener/RequestListener.java

package ssjp.listener;

import java.time.LocalDateTime;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

@WebListener
public class RequestListener implements ServletRequestListener {
  @Override public void requestInitialized(ServletRequestEvent sre) {
    HttpServletRequest req = (HttpServletRequest) sre.getServletRequest();
    System.out.print(LocalDateTime.now());
    System.out.print(" Request initialized ");
    System.out.println(req.getRequestURI());
  }
  @Override public void requestDestroyed(ServletRequestEvent sre) {
    HttpServletRequest req = (HttpServletRequest) sre.getServletRequest();
    System.out.print(LocalDateTime.now());
    System.out.print(" Request destroyed ");
    System.out.println(req.getRequestURI());
  }
}

メソッド #requestInitialized(ServletRequestEvent) が処理の前、requestDestroyed(ServletRequestEvent) が処理の後で実行されます。

また、@WebListener を付けて、サーバーに見つけてもらうようにしています。

手順2. 確認

コンテナ(Jetty Plugin など)を起動して、ブラウザで http://localhost:8080/res/html を開きます。

すると以下の文字列が標準出力されます。

2017-08-21T10:19:01.437 Request initialized /res/html
2017-08-21T10:19:01.440 Request destroyed /res/html

/res/html を処理するサーブレットは、記事「Servlet:HTMLを返す」に実装例があります。

コード

今回のコードは GitHub にも置いています。

GitHub - ssjp(※ Servlet Sample Jetty Plugin)