我在 Safari 扩展中遇到以下问题。我要求用户提供他们的网络服务用户名/密码,并发送一个快速请求以验证凭据是否正确。如果不是,该服务将以我认为应该的方式响应 401。问题是 Safari 似乎在我的 javascript 代码可以处理它之前拦截了这个响应,显示灰色登录框而不是让我处理错误。
我能做些什么吗?我正在使用 js 库进行调用,但它在功能上等同于以下 jQuery。
$.ajax({
type: "GET",
url: url,
username: username,
password: password,
success: function() { /* handle success */ },
error: function() { /* handle error */ }
});
最佳答案
据我所知(在我自己遇到这个问题之后)你无法让 Safari 停止拦截 401
。如果这些发现是正确的,那么唯一的方法就是创造性地(读作:错误)使用另一个错误代码,例如403
,或使用自定义的(见下文)。
当然,这假设您有权更改从 Web 服务发回的状态代码(如果您也开发了 Web 服务,则问题并不完全清楚)。
403
,当然,实际上是在说“您已经通过身份验证,但无权访问此资源”,这是不正确的(因此是“滥用”),但至少它有据我所知,在浏览器中没有副作用。
400
有时用作替代方法,但由于那个(“错误的请求”)实际上意味着 HTTP 协议(protocol)错误,它可能会导致副作用(从未见过或听说过)发生,但有可能,它可能会导致某些 future 的浏览器或反劫持软件试图开始故障排除/诊断的过度帮助尝试。
412
是我见过的另一种选择(“前提条件失败”),但它实际上是为了表明服务器没有达到要求请求设置的先决条件。
或者您可以编写自己的非标准 4xx
错误 - 例如461
- 这是允许的(注意 twitter 有一个自定义的 420
状态代码,例如)
关于javascript - 如何防止Safari拦截ajax请求的401响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137611/