日期:2014-05-17  浏览次数:20681 次

struts的令牌机制解决重复提交是好的方案吗?
看了一下Struts令牌的原理,用token机制解决重复提交问题,看似有效。
但是实际的情况,感觉这个功能很鸡肋。
我的重复提交主要是快速连续点击提交按钮造成的,这样浏览器连续发多个请求过去,根据token来判断,只有第一个请求被执行,后面的被拒绝,但是第一个请求执行完成的返回内容没有了,浏览器只能返回最后一个请求的结果,而这个请求被拒绝(空白或者导出错误页),用户无法知道是否提交成功了。
另外,如果点击提交按钮是ajax请求,连续点击时,第一个请求的执行结果json无法返回,而后面的请求被拒,无法返回正确的数据,而且,ajax请求时,页面不刷新,应允许正常的多次提交(如修改保存),仅防止快速点击按钮造成的重复提交,所以提交请求执行后,应重置session中的token,并把新token值返回用于重置页面中的隐藏域,使下一次提交时能够成功,但由于第一个成功的请求无法返回,token也无法重置,这样再点击提交按钮就总是报重复提交了。

有人说用前端解决,按钮点击后禁用,直到ajax返回再启用,或返回新页面内容或跳转到新页。但是这样的话,还要那个令牌机制干嘛?前端方案毕竟需要每个页面手写的,令牌机制则是框架层面的,如果能避免上述问题,才是最佳方案,是否我对struts令牌的理解有误?Struts也有这些问题吗?
重复提交 struts

------解决方案--------------------
给个替代方案吧,操作成功后跳转到一个显示操作成功失败的页面,这样或许会好点
------解决方案--------------------
我觉得你第一个分析的有点道理。
但是ajax那个没问题,ajax有个参数叫async ,意思是是否异步请求,改成false。ajax请求之后,浏览器是不让做其他操作的,直到有返回值


async (default: true)
Type: Boolean
By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success().


详细:http://api.jquery.com/jQuery.ajax/
------解决方案--------------------
楼主,你能不能用session的原理那样做呢,每次提交都会设置一个唯一的表示过去,然后后面判断是否是唯一的呢,这样不就会避免重复提交了吗,session有一个sessionID,你自己可以了解下
------解决方案--------------------
请求是否成功和令牌无关系,令牌在请求过程中作用,进行匹配来判断是否要继续处理请求
------解决方案--------------------
除了token机制以外使用<action>标签下的type="redirectAction",后面接Action 的名字即可。
------解决方案--------------------
点击一下 按钮直接变灰不就行了