Scala 播放/缩放:在ActionBuilder中使用重定向

Scala 播放/缩放:在ActionBuilder中使用重定向,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我正在尝试构建一个简单的操作,用于在游戏控制器中检查会话是否处于活动状态: import play.api.mvc._ import scala.concurrent._ object AuthAction extends ActionBuilder[Request] { def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = { if (req

我正在尝试构建一个简单的操作,用于在游戏控制器中检查会话是否处于活动状态:

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)
        }
    }

}
问题是,它无法识别
重定向
。我如何让它在这个范围内工作?我希望在需要授权的控制器中使用此操作:

object Application extends Controller {

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

}
这两个文件将是不同的

附带问题:
invokeBlock[A]
Request[A]
中的“A”到底是什么

我在玩2.2.1,Scala 2.10.3,Java 1.8 64位

更新:尝试了这个,它不再给出任何错误,但它不起作用-重定向似乎被忽略

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)
    }

}

您需要包括
导入play.api.mvc.Results.\ucode>

从官方

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


总之,
Action[A]
使用
BodyParser[A]
从HTTP请求中检索
A
类型的值,并构建一个
request[A]
对象,该对象被传递给Action代码。

终于找到了一个解决方案。在这种情况下,如果不满足条件(存在会话),自定义操作“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)
        }
    }

}

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

对象身份验证扩展了ActionBuilder[请求]{

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

}

看起来我离目标更近了一点,但它看起来仍然像一条死胡同-
重定向
不起作用,它还要求返回
未来[SimpleResult]
不管是什么……啊,是的,Play 2.2想要未来。成功。。。我认为else条款是必需的。