![[Play framework 2.0]リクエストをインターセプト](https://devio2023-media.developers.io/wp-content/uploads/2011/11/play201.png)
[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を受け取るので、クエリストリングにもアクセス可能です。
まとめ
今回はリクエストをフックする方法をご紹介しました。
ここで処理を記述すれば、ログやバリデーションや認証などいろいろ捗りそうです。