【问题标题】:Play/Scala: use Redirect in ActionBuilderPlay/Scala:在 ActionBuilder 中使用重定向
【发布时间】:2016-08-30 16:56:53
【问题描述】:

我正在尝试构建一个简单的操作以在 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 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)
    }

}

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

    您需要包含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] 对象。

    【讨论】:

    • 我似乎离得更近了一点,但它仍然看起来像一个死胡同 - Redirect 不起作用,它还要求返回 Future[SimpleResult] 不管那是什么......跨度>
    • 啊,是的,Play 2.2 想要一个 Future.successful... 我相信 else 子句是必需的。
    【解决方案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)
            }
        }
    
    }
    

    【讨论】:

      【解决方案3】:

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

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

      }

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 2018-11-23
        • 1970-01-01
        • 2012-05-18
        • 2013-03-06
        相关资源
        最近更新 更多