[Play framework 2.0]リクエストをインターセプト

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

リクエストをインターセプトする

play2.0ではGolobalSettignsを継承したクラスを使用し、アプリケーション起動時や終了時に処理をいれることができます。
これに加え、リクエスト時に処理を挟み込むことも可能になっています。
今回はリクエスト時に処理をフックする方法をご紹介します。

今回使用した動作環境は以下のとおりです。
HEADを取得してビルドします

  • OS : MacOS X 10.7.4
  • Playframework : HEAD
  • Java : 1.6.0_26

注意:
この記事ではgithubから取得したHEAD版を使用して試しています。
正式リリース前の状況のため思わぬ不具合が生じるかもしれませんので、ご了承ください。

ソースのHEADを取得してセットアップ

まだgithubからソースを取得していない人は、play2.0のソースを取得してビルドしましょう。

$ git clone https://github.com/playframework/Play20.git
$ cd Play20/framework
$ ./build
> complile
> build-repository
> publish-local

すでにソースを取得している人は、最新の状態に更新してビルドします。

$ git pull
$ cd Play20/framework
$ ./cleanEverything
$ ./build
> compile
> build-repository
> publish-local

これで準備ができました。

プロジェクト作成

Scalaベースのプロジェクトを作成し、sbtコンソールを起動します。

% play new intercept
% cd intercept
% play

ソースをEclipseで編集したいなら、eclipsifyを実行してeclipseプロジェクト化してインポートしてソースの修正をしましょう。

>[intercept] $ eclipsify

サンプルコードを記述

localhost:9000にアクセスしたらリクエストをフックして、内容を表示する簡単なサンプルを作成します。
Globalオブジェクトを追加しましょう。
intercept/appディレクトリ直下にglobal.scalaファイルを作成し、下記のように記述します。

import play.api._
import play.api.mvc._
import play.api.mvc.Results._

object Global extends GlobalSettings {

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
     println("リクエストの確認:")
     println("executed before every request:" + request.toString)
     super.onRouteRequest(request)
  }
}

onRouteRequestをオーバーライドすることで、リクエストをフックすることができます。

ではアプリケーションを起動して、localhost:9000にアクセスしてみましょう。
Playコンソールからrunコマンドを実行し、localhost:9000にブラウザでアクセスしてください。
下記のようなログが出力されます。

[info] play - Application started (Dev)
リクエストの確認:
executed before every request:GET /
リクエストの確認:
executed before every request:GET /assets/stylesheets/main.css
リクエストの確認:
executed before every request:GET /assets/javascripts/jquery-1.7.1.min.js

リクエストの回数分だけonRouteRequestが実行されています。
RequestHeaderを受け取るので、クエリストリングにもアクセス可能です。

まとめ

今回はリクエストをフックする方法をご紹介しました。
ここで処理を記述すれば、ログやバリデーションや認証などいろいろ捗りそうです。