表單重複提交Double Submits

可能發生的場景: 
javascript

  • *屢次點擊提交按鈕html

  • *刷新頁面java

  • *點擊瀏覽器回退按鈕ajax

  • *直接訪問收藏夾中的地址spring

  • *重複發送HTTP請求(Ajax)apache


(1)點擊按鈕後disable該按鈕一下子,這樣能避免急躁的用戶頻繁點擊按鈕。 
這種方法確實有些粗暴,友好一點的能夠把按鈕的文字變一下作個提示,好比Bootstrap的作法:http://getbootstrap.com/javascript/#buttons 

(2)不disable按鈕,經過全局變量來控制屢次點擊(只有頁面從新加載後能夠再次點擊)。 
bootstrap

Js代碼  收藏代碼瀏覽器

  1. var isProcessing = false;  session

  2. function doSignup() {  url

  3.   if(isProcessing) {  

  4.     alert('The request is being submitted, please wait a moment...');  

  5.     return;  

  6.   }  

  7.   isProcessing = true;  

  8.   

  9.   // do something......  

  10. }  


須要注意的是若是是AJAX請求的話必定要在請求回來後重置這個值: 

Js代碼  收藏代碼

  1. $.ajax({  

  2.   url : "",  

  3.   complete :function() {  

  4.     isProcessing = false;  

  5.   },  

  6.   success :function(data) {  

  7.     //...  

  8.   }  

  9. });  



(3)Post-Redirect-Get (PRG) 
提交後發送一個redirect 請求,這樣能避免用戶按F5刷新頁面,或瀏覽器的回退按鈕 
參考:http://en.wikipedia.org/wiki/Post/Redirect/Get 

(4)Synchronizer Token Pattern 
爲每次請求生成一個惟一的Token,把它放入session和form的hidden。 
處理前先校驗token是否一致,不一致屏蔽請求,一致時當即清除後繼續處理。 
好比: 

  • Struts 1.x在Action類中能夠經過saveToken(request)和isTokenValid(request)方法來實現。

  • Struts 2.x提供了org.apache.struts2.interceptor.TokenInterceptor來實現Token校驗。

這種方法也適用於跨站請求僞造Cross-Site Request Forgery (CSRF)。 

參考: 
http://www.zhihu.com/question/19805411 
http://technoesis.net/prevent-double-form-submission/ 
http://stackoverflow.com/questions/2324931/duplicate-form-submission-in-spring 
http://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html

相關文章
相關標籤/搜索