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