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

}

这两个将是不同的文件。

invokeBlock[A]附带问题: and中的“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 是请求正文的类型。我们可以使用任何 Scala 类型作为请求主体,例如String, NodeSeq, Array[Byte], JsonValue, or java.io.File,只要我们有一个能够处理它的主体解析器。

总而言之,anAction[A]使用 a从 HTTP 请求BodyParser[A]中检索类型的值A,并构建Request[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

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

对象身份验证扩展 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 回答