Skip to content

在火狐中使用 $.ajax 时设置了 username 导致无法发送请求的问题

🏷️ jQuery

当前页地址为 a.example.com/index ,点击登录时 POST 到 b.example.com/login

代码如下:

javascript
$.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);
    }
});

之前因为开启了认证,所以给 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 请求参数

语法

javascript
open(method, url, async, username, password)
  • method 参数是用于请求的 HTTP 方法。值包括 GET、POST 和 HEAD。
  • url 参数是请求的主体。大多数浏览器实施了一个同源安全策略,并且要求这个 URL 与包含脚本的文本具有相同的主机名和端口。
  • async 参数指示请求使用应该异步地执行。如果这个参数是 false,请求是同步的,后续对 send() 的调用将阻塞,直到响应完全接收。如果这个参数是 true 或省略,请求是异步的,且通常需要一个 onreadystatechange 事件句柄。
  • usernamepassword 参数是可选的,为 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 错误,所以最终也就没有发送之后的请求。

参考

  1. jQuery.ajax()
  2. XML DOM - XMLHttpRequest 对象