2

我们创建了一个强制门户,只要您连接到 Wi-Fi 网络就会打开。最初,Captive Portal 上显示的页面是在服务器端呈现的。

现在我们在页面上添加一些由用户操作触发的 AJAX 功能。然而,我们看到了非常不确定和随机的行为。有时 AJAX 调用是成功的,有时它甚至没有访问网络(通过WireShark检查)。

关于 AJAX 调用的关键事实——

  1. ajax 调用是针对与页面不同的域进行的。服务器确实允许 CORS 标头,并且在普通浏览器中也可以正常工作,但是在 Captive Portal 中失败了。

  2. ajax 调用本质上是异步的(尽管也尝试过同步调用 - 不走运)。

  3. 我在 ajax 调用中设置了几个标头(授权、客户端 ID、用户 ID)。

  4. GET 和 POST 都面临这个问题。

  5. 调用失败的状态码为 0。

  6. 问题主要出在 Apple 设备上。在 Mac 中它每次都失败,在 iPhone 中它是随机的。奇怪的是——同一部 iPhone 在不同的时间表现不同。

没有太多资源可以找到有关 Captive Portal 的技术规范。少数可用的没有帮助或已经过时(当我测试 cookie 正在工作并且我在某个地方读到它在强制网络中不可用时)。

这里要考虑的一件关键事情是 - 如果对同一个域进行 AJAX 调用,它总是成功的。但是,如果是相同的域策略,则无法解释行为的随机化。我也检查了 WebKit 代码中的一些信息(https://github.com/WebKit/webkit/blob/b46afedc13edea0847ebf02414f803bbe9781b70/Source/WebCore/xml/XMLHttpRequest.cpp#L567)但也没有太多运气。

下面就像一个失败的浏览器信息 ——Mozilla/5.0 (iPhone; CPU iPhone OS 11_1_1 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Mobile/15B150

下面是 ajax 调用的 Javascript 代码——

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        // do something good
    } else {
        // do something evil
    }
};
// Call is made to some IP different than the domain
xhttp.open("GET", "http://255.255.255.255:255/xyz", true);
xhttp.setRequestHeader('authorization', 'some-random-hex-digit');
xhttp.setRequestHeader('client-id', 'some-random-client-id');
xhttp.send(JSON.stringify({}));

任何人都面临过类似的问题或可能会在这里提出一些启示?我被困了2天。

4

0 回答 0