gpt4 book ai didi

http - 在未经授权的异步请求上 Play Framework 服务器端重定向

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:25:20 25 4
gpt4 key购买 nike

我在单页应用程序中使用 Play Framework/Reactjs。身份验证是使用 ActionBuilders 构建的,这样从浏览器发出的任何异步请求都受到“AuthorizedAction”的保护。

下面是 ActionBuiler 的 invokeBlock 的实现:

override def invokeBlock[A](request: Request[A], block: (AuthorizedRequest[A]) ⇒ Future[Result]): Future[Result] = {
val maybeToken = request.headers.get(AuthTokenHeader).orElse(request.getQueryString(AuthTokenUrlKey))

maybeToken match {
case Some(token) => cache.get[Long](token) match {
case Some(u_id) =>
val user = User.findByID(u_id).get
val req = AuthorizedRequest(request, user)
block(req)
case None => Future.successful(Unauthorized) // REDIRECT HERE
}
case None => Future.successful(Unauthorized) // REDIRECT HERE
}
}

这很好用,但有一个异常(exception):我不想简单地返回 Unauthorized 也重定向到登录页面。因为截至目前,如果 token 超时,并且用户导致异步请求被触发,它只会在控制台中出错,页面看起来会损坏。

方法一:

将上面的两行 Future.successful 替换为:

Future.successful(Redirect("/login"))

这实际上确实为 /login 路由调用了 Controller ,但是 URL 并没有改变。相反,被触发的异步请求的响应包含数据 =

`<!DOCTYPE html ...

这是一个异步请求的例子,其 response.data 包含下面的屏幕截图文本:

axios('/ping')
.then((response) => {
let userID = response.data; // contains junk
store.dispatch(SomeAction.xyz(userID))
})
.catch((error) => {
browserHistory.push('/login');
})

enter image description here

看来我在这里遗漏了一些重要的东西。有什么想法可以从这里开始吗?

方法二:

在前端,使用 React router 的 browserHistory.push('/login')在所有异步请求的 .catch()

虽然我想尽可能避免这种情况,但如果方法 1 能够成功的话。

谢谢

最佳答案

事实证明,这与 Play Framework 关系不大,而与 HTTP 代码/响应以及浏览器如何解释它们关系更大。

似乎我们不应该将重定向返回给异步请求,因为它们会导致问题中方法 1 的问题。

相反,人们一直在建议以下其中一项:

  • 返回 Ok/200,其中包含一些特定的 header ,指示前端必须进行重定向
  • 返回一些自定义错误代码,例如Status(xyz) 前端代码将理解并解释为重定向到某个路由的请求。

选择合适的HTTP代码是另外一个话题,从上面的两个选项中,我们有三个选择:

  • 200 或自定义 2xx 代码,被解释为成功并在 promise 中如此处理
  • 3xx 自定义代码,在我们要求重定向时可能看起来很合适
  • 401 或自定义 4xx 代码。从技术上讲,传入的异步请求是未经授权的 (401),因此应该是 error 级别的响应。

关键部分是处理响应代码似乎必须在前端,按照问题中的方法 2。

我倾向于默认的 401

关于http - 在未经授权的异步请求上 Play Framework 服务器端重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42759515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com