$.ajax with auth 在 Safari 中默默地失败(jQuery 2.1.3)
$.ajax with auth silently failing in Safari (jQuery 2.1.3)
每当我尝试在 Safari 中发送带有 username
和 password
选项的 $.ajax
请求(同源)时,它只会无声地失败并且永远不会触发任何完成、成功或错误回调。完全相同的请求在 Chrome.
中工作正常
req = $.ajax
url: ...
type: 'POST'
username: ...
password: ...
data: ...
req.done ...
req.fail ...
如果我运行相同的代码,但没有 username
或 password
;
req = $.ajax
url: ...
type: 'POST'
data: ...
请求实际上在 Safari 中通过了,但显然我的服务器的身份验证失败了。我什至不确定如何调试它。我尝试在 jQuery 的源代码中围绕 $.ajax
回调删除一些日志行,看起来(尝试的)经过身份验证的请求甚至从未在 Safari 中退出。
1/8 更新:
还在 Safari/Chrome 中使用 jQuery 1.11.0 进行了测试,发现了相同的结果。
1/8 更新:
gulty 的 beforeSend 解决方案是我在 Safari 中获得基本身份验证的唯一方法:
req = $.ajax
url: ...
type: 'POST'
beforeSend: (xhr) -> xhr.setRequestHeader('Authorization', 'Basic username:password')
data: ...
您的代码适用于大多数浏览器,无论如何 Safari 没有处理请求,原因只有开发人员知道。
有一个解决方法 - 您需要使用 headers:{} 或在 beforeSend 中设置请求 headers,如下所示:
beforeSend: function (req) {
req.setRequestHeader('Authorization', "username:password");
}
这是对您的代码的补充 - 对于其他浏览器,您仍应保留用户名:/密码:,因为没有这些凭据我没有正确测试代码。
每当我尝试在 Safari 中发送带有 username
和 password
选项的 $.ajax
请求(同源)时,它只会无声地失败并且永远不会触发任何完成、成功或错误回调。完全相同的请求在 Chrome.
req = $.ajax
url: ...
type: 'POST'
username: ...
password: ...
data: ...
req.done ...
req.fail ...
如果我运行相同的代码,但没有 username
或 password
;
req = $.ajax
url: ...
type: 'POST'
data: ...
请求实际上在 Safari 中通过了,但显然我的服务器的身份验证失败了。我什至不确定如何调试它。我尝试在 jQuery 的源代码中围绕 $.ajax
回调删除一些日志行,看起来(尝试的)经过身份验证的请求甚至从未在 Safari 中退出。
1/8 更新:
还在 Safari/Chrome 中使用 jQuery 1.11.0 进行了测试,发现了相同的结果。
1/8 更新:
gulty 的 beforeSend 解决方案是我在 Safari 中获得基本身份验证的唯一方法:
req = $.ajax
url: ...
type: 'POST'
beforeSend: (xhr) -> xhr.setRequestHeader('Authorization', 'Basic username:password')
data: ...
您的代码适用于大多数浏览器,无论如何 Safari 没有处理请求,原因只有开发人员知道。
有一个解决方法 - 您需要使用 headers:{} 或在 beforeSend 中设置请求 headers,如下所示:
beforeSend: function (req) {
req.setRequestHeader('Authorization', "username:password");
}
这是对您的代码的补充 - 对于其他浏览器,您仍应保留用户名:/密码:,因为没有这些凭据我没有正确测试代码。