【问题标题】:Infinite redirect loop on Android when redirecting from server with AngularJS使用AngularJS从服务器重定向时Android上的无限重定向循环
【发布时间】:2013-02-15 16:38:51
【问题描述】:

我正在为旧版本的 Android (2.3.x) 构建一个 web/phonegap 应用程序。在我尝试将任何服务器重定向添加到组合中之前,一切都很好。这是场景:

服务器 (node.js) 有一个在“/”处监听的路由。当这条路由被命中时,它会检查是否存在会话。如果没有会话,它会重定向到 /login。很好,这部分有效(无论如何,服务器方面)。

当客户端获得重定向时,问题就出现了。因为Android 2.3 不支持history.pushState,它回退到hashbangs。这意味着 AngularJS 将 url 重写为 /#!/login,这会导致服务器请求到 '/',这会导致服务器检查会话并重定向到 '/login',这会导致 AngularJS 将 url 重写为 /#!/登录..等等等等..无限期。

任何想法如何使用 AngularJS 从服务器重定向?我不应该在我的路由中处理这个逻辑,而是尝试在客户端上实现它吗?我敢肯定,必须有一种方法来处理这个问题,但我似乎无法弄清楚。

任何帮助将不胜感激。谢谢!!

【问题讨论】:

  • 我不确定我是否完全按照您的描述:如果服务器发出重定向,则应该由浏览器接收,而不是 AngularJS。但也许您通过 xhr 从服务器获取该 URL,并分配给 $location,但这是行不通的:来自 Angular 文档:“$location 服务只允许您更改 URL;它不允许您更改重新加载页面。当您需要更改 URL 并重新加载页面或导航到其他页面时,请使用较低级别的 API,$window.location.href。"或者,也许您需要重定向到/login#!/login
  • 我希望我能准确地展示发生了什么,但 Angular 正在“劫持”我的服务器重定向。服务器重定向到 /login 并且 Angular 将其重写为 /#!/login,这会导致服务器说“你没有登录,所以重定向到登录”。服务器将路由获取为 /(这是应该的,因为 Angular 将其重写为)。

标签: android node.js angularjs


【解决方案1】:

使用简单的对象来控制重定向:
如果用户没有登录,返回{action: "redirect" url:"/login"}

然后在客户端,得到响应后,检查action == 'redirect'$location.path(url)

【讨论】:

    【解决方案2】:

    如果您纯粹在客户端进行身份验证会更好。在角端开始时进行 ajax 调用,询问我们是否已登录。如果没有,提示用户输入信息(可能在模式对话框中),然后将其发布到服务器上的“/login”。

    为了安全起见,任何对身份验证敏感的信息都不应存储在客户端。相反,使用 ajax 检索它 - 如果用户未正确登录,则使用 401 或一些错误回复 ajax。

    【讨论】:

    • 鉴于我们的应用程序的性质,这将是一个艰难的实现——我已经尝试过了。遗憾的是,我必须在已经设置好的服务器架构范围内工作。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2020-09-22
    • 2017-05-11
    相关资源
    最近更新 更多