小编典典

无法处理Ajax中的302重定向,为什么?

ajax

我有一个使用Forms Authentication以asp.netmvc编写的后端服务器。当用户未通过身份验证时,服务器将自动发送302重定向到“登录”操作并返回“登录”页面。

在客户端,我有一个项目列表。只有经过身份验证的用户才能访问此列表。在页面上,我有一个使用Ajax(jQuery的$ .ajax函数)刷新列表的按钮。

现在,我的问题是身份验证票证超时并且用户单击“刷新”按钮时:

  • 我的函数发送ajax请求以获取刷新列表
  • 服务器检测到身份验证票证无效,并发出302重定向。
  • 浏览器 自动 处理该302响应,并强制我的ajax函数将另一个ajax请求发送到Login操作,最终结果是状态为200的HTML。我的脚本很困惑,因为列表也是状态为200的HTML。

我想要的是当身份验证票证超时并且用户单击“刷新”按钮时,我应该能够检测到该错误并显示一条消息,要求用户登录。

我试图通过在登录操作中添加自定义标头(IS_LOGIN)并在我的Ajax响应中进行检查来解决此问题。但这不是一个好的解决方案。

所以我的问题是:

  • 解决此问题的最佳方法是什么?
  • 为什么浏览器不让我们的脚本处理302响应?并自动强制我们的ajax创建另一个请求。这是浏览器或jquery库的问题吗?有什么原因吗?(安全,…)

感谢您的任何答复。


阅读 838

收藏
2020-07-26

共1个答案

小编典典

当它是XHR时,您不应重定向该呼叫,而应使用a响应401Unauthorized并在回调中处理该呼叫。我不知道ASP.NET,但是我对SpringSecurity做过类似的事情。

继承人的概念:

  • 获取认证状态
  • 检查标题 X-Requested-With: XMLHttpRequest
  • 找到但未通过身份验证时回复 401 Unauthorized
  • 未找到且未通过身份验证的重定向。

最重要的是,在某些情况下,XHR调用需要与其他HTTP请求进行不同的处理。仅当同一资源位于另一个位置时,才应重定向XHR。

回答你的问题

您无法使用XHR回调处理重定向,因为浏览器会自动处理重定向。您将只取回重定向位置的内容。

2020-07-26