当前位置: 首页 > 面试题库 >

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

段干玺
2023-03-14
问题内容

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

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

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

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

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

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

所以我的问题是:

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

感谢您的任何答复。


问题答案:

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

继承人的概念:

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

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

回答你的问题

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



 类似资料:
  • 我在我的应用程序上安装了一个服务工作者,它安装得很好,激活得很好,缓存也可以。 但当我点击302页面时,缓存完成后,它会告诉我: http://localhost:8000/form/的Fetch事件导致网络错误响应:重定向响应用于重定向模式不是“跟随”的请求。 我已经读了很多关于这个主题的文章,我在这里查阅了一些帖子:服务人员破坏301重定向,还有那里https://github.com/w3c

  • 问题内容: 我正在从域A到域B进行AJAX呼叫。 我的域B检查A是否在允许的域列表中,并将设置为域A。到目前为止,一切都很好。 域B通过使用标头向域C发送302重定向来响应请求。 AJAX调用遵循重定向到域C的操作,但具有标头: 。 在重定向之后,我希望将标头设置为域A。 谁能向我解释为什么将源设置为域A而不是域A? 例 从域A到B的请求 来自网域B的回应: AJAX调用将重定向到域C: 问题答案

  • 我正在尝试使用SpringREST模板进行post请求以登录。 我的ResponseEntity状态是302,我想按照此请求获取正文响应,因为我没有获取此请求的正文。 我能做些什么来解决这个问题?!

  • 我正在执行从域 A 到域 B 的 AJAX 调用。 我的域 B 检查 A 是否在允许的域列表中,并将设置为域 A。目前为止,一切都好。 域 B 通过使用标头向域 C 发送 302 重定向来响应请求。 AJAX 调用遵循重定向到域 C,但具有标头:。 我希望在重定向后将标头设置为域 A。 有人能解释一下为什么原点设置为<code>null</code>而不是域A吗? 示例 > 从域 A 到 B 的请

  • 问题内容: 我正在将一些数据发布到正在回答302移动临时的服务器上。 我希望HttpClient遵循重定向并自动获取新位置,因为我相信这是HttpClient的默认行为。但是,我得到一个例外,而不是按照重定向:( 这是相关的代码,任何想法都将不胜感激: 问题答案: HttpClient的默认行为符合HTTP规范(RFC 2616)的要求 您可以通过子类化DefaultRedirectStrateg

  • 11.7. 处理重定向 你可以使用两种不同的自定义 URL 头信息来处理永久重定向和临时重定向。 首先, 让我们来看看重定向处理的必要性。 例 11.10. 没有重定向处理的情况下,访问 web 服务 >>> import urllib2, httplib >>> httplib.HTTPConnection.debuglevel = 1 >>> request = url