只执行一次ajax

时间:2014-01-29 15:21:47

标签: javascript php jquery ajax json

我只想执行我的ajax帖子1次,我尽量避免让用户刷新页面并执行ajax帖子这么多次, 我想创建一个饼干,但我不知道,我不确定,有人知道吗?

这是我的jquery。

var t = jQuery.noConflict();
t( document ).ready(function() {
  t.cookie("example", "foo", { expires: 7 }); // Sample 2
  console.log( "ready!" );
  alert(t.cookie("example"));
  var data = '<?php echo json_encode($json_full);?>';
  t.ajax({
    url: 'my api url', 
    type: 'POST', 
    success: function(r) { alert(JSON.stringify(r)) }, 
    dataType: 'JSON', 
    data: { data: data, }
  })
});

/ 我只需要运行这个AJAX一次,因为是一个结账页面发送订单,如果我刷新页面,每次发送相同的订单,这我不想 /
非常感谢!

3 个答案:

答案 0 :(得分:2)

在客户端的浏览器上无法安全地控制这些内容。任何对JavaScript知识最少的用户都可以为他们的浏览器打开开发人员工具,并操纵代码或您可能存储的任何值(例如删除您设置的cookie)。

此限制应在服务器上实施。


这实际上取决于您的申请范围。您可能能够限制每个IP地址的请求,但这可能会阻止来自同一办公室的多个人,例如同时加载页面。

使用用户身份验证和持久性服务器存储,您将能够限制请求的效果,但您可能无法阻止发送实际请求,因为任何人都可以通过浏览器外部发出请求。您可以存储发起请求的用户的user_id,并且仅在自上次请求后经过特定时间时才允许生成操作。

答案 1 :(得分:1)

避免双重提交的更好解决方案是对提交请求使用POST查询,让服务器通过重定向到正常(无害)收据/谢谢页面进行响应。

然后,如果用户刷新收据页面,他们只会重复GET请求到收据页面而不是帖子。

如果恶意用户故意尝试重新提交,您仍应添加一些检查服务器端以避免多个POST请求(使用会话,时间戳或其他内容)。

答案 2 :(得分:-1)

这仅适用于IE8及更高版本,但您可以使用localStorage

var t = jQuery.noConflict();
t( document ).ready(function() {
    t.cookie("example", "foo", { expires: 7 }); // Sample 2
    console.log( "ready!" );
    alert(t.cookie("example"));

    if(localStorage['submitted'] === undefined){
        var data = '<?php echo json_encode($json_full);?>';
        t.ajax({
            url: 'my api url', 
            type: 'POST', 
            success: function(r) { 
                localStorage['submitted'] = true;
                alert(JSON.stringify(r));
            }, 
            dataType: 'JSON', 
            data: { data: data, }
        })
    }
});

这是第一次运行AJAX,因为你没有设置localStorage变量,但是一旦成功,它就不会在页面刷新时重新提交。

如果您希望以后能够再次发送,请使用sessionStorage代替localStorage。相同的语法和一切。