是否有跨浏览器的方法来忽略 XHR 触发的 401 错误?
Posted
技术标签:
【中文标题】是否有跨浏览器的方法来忽略 XHR 触发的 401 错误?【英文标题】:Is there a cross-browser way to ignore 401 errors triggered by XHRs? 【发布时间】:2011-08-18 08:10:28 【问题描述】:为了尽可能保持 REST 方法的纯粹性,我决定将应用程序作为 API - 直到最后一点。
不幸的是,我遇到了一个绊脚石。在用 php 编写了一个 Digest 身份验证处理程序后,我发现自己无法让 Web 浏览器中的用户体验像基于表单的身份验证方法那样友好。
这样做的原因是,即使我可以通过 javascript 模拟 Digest 身份验证响应,使用 html 表单中的用户名和密码(由于它们的生成方式,我可以安全地将 nonce
值提供给脚本),失败时,浏览器仍然显示标准的、丑陋的身份验证提示。
有没有办法解决这个问题?较早的问题引用了mozBackgroundRequest
,但这似乎很难跨浏览器。
谢谢!
【问题讨论】:
【参考方案1】:您可以先使用 AJAX 发出请求,以确保提供的身份验证详细信息有效。
如果他们这样做,就做你一直在做的事情。如果他们不这样做,请以您自己的更好的方式告诉用户...
编辑
如果您控制 PHP 中的 auth 例程(并且如果 auth 失败,大概是在执行 header('HTTP/1.1 401 Unauthorized');
等),您可以……不这样做。相反,以正常的 200 OK 响应,但在正文中放入一个字符串,您可以在 ajax.responseText
中查找该字符串(例如“authFailed”或其他内容)。
您可以只向正常浏览器请求中不存在的 AJAX 请求添加标头(或 cookie 或其他内容),以便区分 AJAX 身份验证检查和正常的经过身份验证的会话。
目前我脑子里有些模糊(这是漫长的一天),但我确信可以使用这种方法来完成。
【讨论】:
嗯,这就是我目前正在做的事情。问题是提示对话框似乎无论如何都会显示 - 除非您的意思是我编写了某种其他验证数据的方法?这可能是一种选择,尽管很混乱。 不,我的意思是检查responseCode
中的 401 - 我认为这会在不显示提示的情况下静默失败,但我只是尝试过,但没有。实际上,我只是从阅读另一篇文章中产生了一个想法,在一两分钟内看到我的编辑......
刚刚测试过——我认为这似乎是最简洁的解决方案,直到希望浏览器供应商提供更好的方法。我遇到了一个不同的问题——我提出的身份验证请求不会被“记住”——但这是另一个问题,而且很可能仍未解决......
你可以记住一些关于 Cookie 的东西,也许吧?
是的,但这几乎违背了使用 HTTP Digest 身份验证的目的,而不仅仅是滚动我自己的基于摘要的身份验证(可能由 Javascript 提供支持)以上是关于是否有跨浏览器的方法来忽略 XHR 触发的 401 错误?的主要内容,如果未能解决你的问题,请参考以下文章
为什么form表单提交没有跨域问题,但ajax提交有跨域问题?
为什么form表单提交没有跨域问题,但ajax提交有跨域问题?
是否有跨浏览器的方式在 expando 属性上使用 jQuery 选择器?