如何防止Safari拦截对ajax请求的401响应

时间:2012-02-04 01:22:38

标签: javascript ajax safari

我在Safari扩展程序中遇到以下问题。我要求用户提供Web服务的用户名/密码,并发送快速请求以验证凭据是否正确。如果不是,那么该服务将以401认为应该响应。问题是Safari似乎在我的javascript代码可以处理它之前拦截了这个响应,显示灰色登录框而不是让我处理错误。

我能做些什么吗?我正在使用js库来进行调用,但它在功能上等同于以下jQuery。

$.ajax({
  type: "GET",
  url: url,
  username: username,
  password: password,
  success: function() { /* handle success */ },
  error: function() { /* handle error */ }
});

2 个答案:

答案 0 :(得分:4)

据我所知(自己遇到此问题后),你无法让Safari停止拦截401。如果这些发现是正确的,那么唯一的方法就是创造性地(阅读:错误地)使用另一个错误代码,例如: 403,或使用自定义的(见下文)。

当然,这假设您可以访问更改从Web服务发回的状态代码(如果您开发了Web服务,则问题并不完全清楚。)

当然,

403确实说“您已经过身份验证,但未获得访问此资源的授权”,这是不正确的(因此“滥用”),但至少它没有副作用在我所知道的浏览器中。

400有时被用作替代方案,但由于那个(“错误请求”)实际上意味着表示HTTP协议错误,它可能会导致副作用(从未见过或听说过它,但是可能,它可能会导致未来某些浏览器或反劫持软件过度帮助您尝试启动故障排除/诊断。)

412是我见过的另一种选择(“前提条件失败”),但它实际上是为了表明服务器不符合前提条件请求设置。

或者您可以编写自己的非标准4xx错误 - 例如461 - 这是允许的(例如,请注意Twitter有自定义420状态代码)

答案 1 :(得分:3)

更正确的方法是继续使用401作为错误代码,但在发送凭据时却不发送WWW-Authenticate标头,但它们不正确。

不再触发浏览器的对话框,并允许您直接处理401