在火狐中使用 $.ajax 时设置了 username 导致无法发送请求的问题
🏷️ jQuery
当前页地址为 a.example.com/index ,点击登录时 POST 到 b.example.com/login 。
代码如下:
$.ajax({
async: false,
type: "post",
dataType: "json",
contentType: "application/json; charset=utf-8",
url: "b.example.com/login",
ifModified: false,
cache: false,
data: data,
username: "administartor",
complete: function (d) {},
success: function (d) {
console.log(d)
},
error: function (req, status, err) {
console.log(req);
console.log(status);
console.log(err);
}
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
之前因为开启了认证,所以给 username 赋了值,但是现在已经关闭了认证,之前的旧代码仍然遗留了该参数。
问题就出现在这里。在 Chrome 浏览器中是可以正常登录的,但是在 IE 和 FireFox 中无法登录,甚至连请求都没有发出去。
本以为是 jQuery 的兼容性导致的,但是替换了几个版本的 jQuery 仍然不行。
还调查了是不是跨域的问题,因为一级域名是一样的,应该不存在跨域请求的问题才对。debug 将请求的地址改成同一个二级域名之后,请求确实是发出去了。但因为实际 a 上并没有登录接口,所以报了 404 错误。所以我在这个思路上查了半天,在 FireFox 的 about:config 页面上更改了几个设置,最后也还是没能正常发送超出请求。
最后,郭威告诉我删除了 username 参数之后,就可以正常发出请求并登录了。
根据 jQuery.ajax() 中的参数说明:
username
Type: String
A username to be used with XMLHttpRequest in response to an HTTP access authentication request.
XMLHttpRequest 会在调用 open()
方法时使用到 username 参数。下面是 XML DOM - XMLHttpRequest 对象 中关于 open()
方法的说明:
XMLHttpRequest.open()
初始化 HTTP 请求参数
语法
open(method, url, async, username, password)
method
参数是用于请求的 HTTP 方法。值包括 GET、POST 和 HEAD。url
参数是请求的主体。大多数浏览器实施了一个同源安全策略,并且要求这个 URL 与包含脚本的文本具有相同的主机名和端口。async
参数指示请求使用应该异步地执行。如果这个参数是false
,请求是同步的,后续对send()
的调用将阻塞,直到响应完全接收。如果这个参数是true
或省略,请求是异步的,且通常需要一个onreadystatechange
事件句柄。username
和password
参数是可选的,为 url 所需的授权提供认证资格。如果指定了,它们会覆盖 url 自己指定的任何资格。
说明
这个方法初始化请求参数以供 send()
方法稍后使用。它把 readyState
设置为 1,删除之前指定的所有请求头部,以及之前接收的所有响应头部,并且把 responseText、responseXML、status 以及 statusText 参数设置为它们的默认值。当 readyState 为 0 的时候(当 XMLHttpRequest 对象刚创建或者 abort() 方法调用后)以及当 readyState 为 4 时(已经接收响应时),调用这个方法是安全的。当针对任何其他状态调用的时候,open()
方法的行为是为指定的。
除了保存供 send()
方法使用的请求参数,以及重置 XMLHttpRequest
对象以便复用,open()
方法没有其他的行为。要特别注意,当这个方法调用的时候,实现通常不会打开一个到 Web 服务器的网络连接。
上面说明的最后一句估计就是没有发出去请求的原因。然后因为 open()
创建 XMLHttpRequest
对象失败,导致发生了 ReferenceError: currentRequests is not defined 错误,所以最终也就没有发送之后的请求。