Play / Scala:在ActionBuilder中使用Redirect

时间:2013-11-09 17:00:28

标签: scala playframework playframework-2.0

我正在尝试构建一个在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."))
    }

}

这两个文件是不同的文件。

附带问题:invokeBlock[A]Request[A]中的“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)
    }

}

3 个答案:

答案 0 :(得分:3)

您需要加入import play.api.mvc.Results._

来自官方docs

A类型是请求正文的类型。我们可以使用任何Scala类型作为请求主体,例如String, NodeSeq, Array[Byte], JsonValue, or java.io.File,只要我们有一个能够处理它的主体解析器。

总结一下,Action[A]使用BodyParser[A]从HTTP请求中检索类型A的值,并构建一个传递给它的Request[A]对象行动代码。

答案 1 :(得分: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)
        }
    }

}

答案 2 :(得分:0)

如果不满足条件,则不会重定向

对象身份验证扩展了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)
    }
}

}