码迷,mamicode.com
首页 > 其他好文 > 详细

表单重复提交Double Submits

时间:2015-09-23 19:41:15      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

可能发生的场景: 

  • *多次点击提交按钮

  • *刷新页面

  • *点击浏览器回退按钮

  • *直接访问收藏夹中的地址

  • *重复发送HTTP请求(Ajax)


(1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。 
这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法:http://getbootstrap.com/javascript/#buttons 

(2)不disable按钮,通过全局变量来控制多次点击(只有页面重新加载后可以再次点击)。 

Js代码  技术分享

  1. var isProcessing = false;  

  2. function doSignup() {  

  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


表单重复提交Double Submits

标签:

原文地址:http://my.oschina.net/friendship/blog/510336

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!