我只想执行我的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一次,因为是一个结账页面发送订单,如果我刷新页面,每次发送相同的订单,这我不想 /
非常感谢!
答案 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
。相同的语法和一切。