通过Javascript发送POST请求的安全方法

通过Javascript发送POST请求的安全方法,javascript,php,jquery,ajax,xmlhttprequest,Javascript,Php,Jquery,Ajax,Xmlhttprequest,我目前正在通过一个具有以下功能的按钮向我的PHP文件发送POST请求: function buttonFunction() { $.post("http://ipaddress/core/file.php",{username:username, password:pword, coins:coins}, function(data) { // Stuff }); } 但是,我最近发现,如果文件进程/PHP脚本仍在运行(试图获取结果数据/响应),并且用户刷新了页

我目前正在通过一个具有以下功能的按钮向我的PHP文件发送POST请求:

function buttonFunction() {
    $.post("http://ipaddress/core/file.php",{username:username, password:pword, coins:coins}, function(data) {
        // Stuff
    });
}
但是,我最近发现,如果文件进程/PHP脚本仍在运行(试图获取结果数据/响应),并且用户刷新了页面,那么PHP进程仍将在服务器上运行。此外,如果用户随后决定再次单击按钮(刷新后),则服务器上的同一用户将运行两个PHP进程(即,如果第一个进程仍在运行):

但是,我遇到了使用Javascript使用
XMLHttpRequest
发送POST数据的情况:

假设我以这种方式发送POST请求,那么当用户刷新/关闭页面时,PHP执行结束是否安全

function buttonFunction() {
    var http = new XMLHttpRequest();
    var url = "get_data.php";
    var params = "lorem=ipsum&name=binny";
    http.open("POST", url, true);

    //Send the proper header information along with the request
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");

    http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
            alert(http.responseText);
        }
    }
    http.send(params);
}
但是,如果这也不起作用,如何解决此问题(同一用户在后台运行多个脚本)?无论修复程序是在PHP文件中还是在JavaScript本身中,我们都非常感谢您的帮助

编辑1:

可能的解决方案

如果我使用
XMLHttpRequest
并在页面卸载之前中止请求会怎么样

window.onbeforeunload = function(event) {
    http.abort();
};

不,如果您以这种方式发布到PHP文件,它仍将运行,直到完成或服务器超时。不管你是直接发布还是通过AJAX发布都不重要。顺便说一句,如果你不能从架构上改变你的应用程序以使其运行得更快,并且用户必须等待你的脚本完成,那么就使用AJAX,但要向他们提供一些操作状态。如果没有任何UI提示正在发生某些事情,用户很可能会认为它不起作用,然后再次尝试提交。@BenDyer在某些情况下,代码实际上可能不起作用(并继续加载),因此无论发生什么情况,用户都将被迫刷新。在这种情况下,如果有一种方法可以解决这个问题?如果是这样,那么您应该在PHP脚本中使用try/catch来检测何时出现了坏情况,然后将其显示给用户。换句话说,PHP脚本应该输出“操作成功!”或“操作失败:原因就在这里”之类的内容。然后在Javascript中读取返回的值,当检测到错误时,解释发生了什么以及用户需要做什么。@BenDyer然而,我的应用程序非常复杂,可以发送/建立/关闭数据包/套接字以及类似的事情。有时候,这种联系就是没有反应。