この記事は公開されてから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を受け取るので、クエリストリングにもアクセス可能です。
まとめ
今回はリクエストをフックする方法をご紹介しました。 ここで処理を記述すれば、ログやバリデーションや認証などいろいろ捗りそうです。