2014-01-29 305 views
0

我只想执行我的ajax文章1次,我尽量避免给用户刷新页面并执行这么多次ajax文章, 我认为在创建一个cookie,但我没有知道,我不确定,有人知道如何?执行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只是一个时间,因为是一个结帐页面发送订单,如果我刷新页面,发送每次都以相同的顺序,这我不想/
非常感谢!

+5

为什么您在页面加载时发送AJAX请求?为什么不在加载页面之前在服务器端处理数据? –

+1

客户端订单处理?这是可以利用的东西。请忘记ajax并创建一个欺诈安全的服务器端代码。 – kawashita86

回答

-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。相同的语法和一切。

+0

不能这样用'localStorage.clear()'绕过? – Lix

+0

完美的作品!非常感谢! – Deimos

+0

你知道我可以做些什么来隐藏浏览器的萤火虫这个功能吗? – Deimos

1

喜欢这些东西不能在客户端的浏览器安全地控制。对JavaScript有最少了解的任何用户都可以打开浏览器的开发工具,并操纵代码或可能存储的任何值(例如删除您设置的cookie)。

这种限制应该在服务器上实现。


这真的取决于您的应用程序的范围。您可能能够限制每个IP地址的请求,但这可能会阻止来自同一办公室的多个人(例如同时加载该页面)。

使用用户认证和持久的服务器存储,你就可以限制要求的效果,但你可能会无法阻止发送任何人的实际要求可以使请求甚至从外浏览器。您可以存储发起请求的用户的user_id,并且只允许自上次请求后经过一定时间后发生的结果动作。

+0

和你的建议lix?你能否以最好的方式解释我 – Deimos

+0

@Deimos - 这真的取决于你的应用程序的范围。您可能能够限制每个IP地址的请求,但这可能会阻止来自同一办公室的多个人(例如同时加载该页面)。如果没有完整的用户身份验证和持久的服务器存储,执行诸如此类的限制将非常困难。 – Lix

+0

@Deimos - 我已经添加了更多的细节给我的答案,但我不知道,你就可以以这种格式在这里得到一个完整的解决方案。 – Lix

1

更好的解决方案,以避免重复的提交,是使用POST查询提交请求,并让一个重定向至正常(无害)收据/三江源页的服务器响应。

然后,如果用户刷新收据页面他们会简单地重复GET请求的收据页面上,而不是职位。

您仍然应该添加一些检查服务器端,以避免重复POST请求以某种方式(使用会话,时间戳或东西),如果恶意用户故意试图重新提交。

+2

我假设所有用户是恶意的;) – Lix

+1

是。尽管在设计客户端代码和可能的错误消息时,我通常假设一个愚蠢但仁慈的用户。每个可能由随机事件和用户无能引起的错误都应该有一个友好的错误消息。最有可能因故意滥用或攻击而导致的错误可能是简单而残酷的“未经授权”或“错误请求”页面。 :) –