3

セッションがアクティブかどうかを確認するために Play コントローラーで使用する簡単なアクションを作成しようとしています。

import play.api.mvc._
import scala.concurrent._

object AuthAction extends ActionBuilder[Request] {

    def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = {
        if (request.session.isEmpty) {
            //Need to redirect to login page    
            Redirect("/login")
        } else {
            //Session is found, continue Action as normal
            block(request)
        }
    }

}

問題は、認識しないことRedirectです。この範囲で動作させるにはどうすればよいですか? 承認が必要なコントローラーでこのアクションを使用したい:

object Application extends Controller {

    def index = AuthAction {
        Ok(views.html.index("You are logged in."))
    }

}

これら 2 つは別のファイルになります。

invokeBlock[A]副次的な質問:との "A" は正確には何Request[A]ですか?

Play 2.2.1、Scala 2.10.3、Java 1.8 64bit を使用しています

更新:これを試してみましたが、エラーは発生しなくなりましたが、機能しません-リダイレクトは無視されているようです。

import play.api.mvc._
import scala.concurrent._
import play.api.mvc.Results._

object AuthAction extends ActionBuilder[Request] {

    def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = {
        if (request.session.isEmpty) {
            Redirect("/login")
        }
        block(request)
    }

}
4

3 に答える 3

3

含める必要がありますimport play.api.mvc.Results._

公式ドキュメントから、

Atype はリクエストボディのタイプです。String, NodeSeq, Array[Byte], JsonValue, or java.io.File処理可能なボディ パーサーがある限り、任意の Scala タイプをリクエスト ボディとして使用できます。たとえば、 です。

要約すると、 はAction[A]を使用して HTTP 要求からBodyParser[A]type の値を取得し、アクション コードに渡されるオブジェクトを構築します。ARequest[A]

于 2013-11-09T19:06:09.220 に答える
2

最後に解決策に出くわしました。この場合、カスタム アクション「AuthAction」は、条件 (セッションが存在する) が満たされない場合、ログイン ページにリダイレクトします。

import play.api.mvc._
import scala.concurrent._
import play.api.mvc.Results._

object AuthAction extends ActionBuilder[Request] {

    def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = {
        if (request.session.isEmpty) {
            Future.successful(Redirect("/login"))
        } else {
            block(request)
        }
    }

}
于 2013-11-09T20:06:13.740 に答える
0

条件が満たされない場合、リダイレクトされません

object Authentication extends ActionBuilder[Request] {

def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = {
    if (request.cookies.get("user").isEmpty) {
        Future.successful(Redirect("/expired"))
    } else {
        block(request)
    }
}

}

于 2016-08-30T08:56:53.547 に答える