标签:
可能发生的场景:
*多次点击提交按钮
*刷新页面
*点击浏览器回退按钮
*直接访问收藏夹中的地址
*重复发送HTTP请求(Ajax)
(1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。
这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法:http://getbootstrap.com/javascript/#buttons
(2)不disable按钮,通过全局变量来控制多次点击(只有页面重新加载后可以再次点击)。
var isProcessing = false;
function doSignup() {
if(isProcessing) {
alert(‘The request is being submitted, please wait a moment...‘);
return;
}
isProcessing = true;
// do something......
}
需要注意的是如果是AJAX请求的话一定要在请求回来后重置这个值:
$.ajax({
url : "",
complete :function() {
isProcessing = false;
},
success :function(data) {
//...
}
});
(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
标签:
原文地址:http://my.oschina.net/friendship/blog/510336