2014-01-29 506 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

是。儘管在設計客戶端代碼和可能的錯誤消息時,我通常假設一個愚蠢但仁慈的用戶。每個可能由隨機事件和用戶無能引起的錯誤都應該有一個友好的錯誤消息。最有可能因故意濫用或攻擊而導致的錯誤可能是簡單而殘酷的「未經授權」或「錯誤請求」頁面。 :) –