卸载时的同步跨域ajax DELETE请求

Synchronous cross-domain ajax DELETE request on unload

本文关键字:ajax DELETE 请求 同步 卸载      更新时间:2023-09-26

我正在处理需要锁定的跨域远程资源。CORs标头设置正确

我正在尝试解决当浏览器窗口关闭时资源未被客户端释放的情况(直到锁定到期)。

我希望在窗口卸载时发送一个同步DELETE请求。我使用jquery(答案可以是纯javascript,如果有必要…我注意到他们的文档说"跨域请求……不支持同步操作",我变得很难过。

是否有可能使一个同步跨域ajax请求?jquery的限制是由于旧的浏览器吗?我读到的所有内容都表明,如果ajax调用是异步的,那么卸载事件侦听器的存在时间将不够长,因此建议使用同步请求进行这种类型的清理。不幸的是,这个呼叫是跨域的…我能做什么?


编辑


所以我很好奇如果我在本地开发(即客户端在127.0.0.1:8080和api在127.0.0.1:8081)或jquery文档只是误导。接下来的事情会给我带来麻烦吗?

这似乎是在Chrome45工作:

var unload_event = "unload." + lock.id
function release_lock(sync) {
    $.ajax({
        method: "DELETE",
        async: !sync,
        data: lock,
        url: lock.url,
        error: function(){
            console.log("failed to release lock " + JSON.stringify(lock));
        },
        success: function(){
            console.log("lock " + lock.id + " released");
            lock = null;
            $(window).off(unload_event);
        }
    });
}
$(window).on(unload_event, function(){
    release_lock(true);
});

它会在控制台中生成以下警告:

Synchronous XMLHttpRequest on the main thread is deprecated because of
its detrimental effects to the end user's experience.
For more help, check http://xhr.spec.whatwg.org/.

我会避免在卸载事件中这样做,因为同步ajax是唯一可行的方法,而同步ajax请求在某些现代浏览器中已被弃用。

选项包括:

keepalive请求

这将涉及定期向服务器发送请求,表明用户仍在编辑资源。这种技术的缺点是,在超时发生之前,资源将保持锁定状态,因此,如果将keepalive设置为1分钟的间隔和3分钟的锁定超时,那么在用户离开页面后,它将保持锁定状态长达3分钟。此外,如果用户失去网络连接3分钟或更长时间,它也将被解锁。

websockets

这将在客户端和服务器之间创建一个打开的连接,当这个连接打开时,您可以保持资源锁定。一旦客户端断开连接,您就可以假设客户端已经关闭了页面并将其解锁。这里的缺点是,如果客户端失去网络连接,它也将被解锁。