求最简单有效的方法---jsp如何限制同一表单被多次提交,用struts可以做到吗

时间:2022-12-30 15:59:54
求最简单有效的方法---jsp如何限制同一表单被多次提交,用struts可以做到吗

19 个解决方案

#1


<form name="form1" onsubmit="return false;">
<input type="hidden" name="submitFlg" value="0">
<input type="button" value="提交" onclick="mySubmit();">
</form>
<script>
function mySubmit() {
  if (document.form1.submitFlg == 0) {
    document.form1.submit();
    document.form1.submitFlg == 1;
  }
}
</script>

#2


好像不行吧
应该在submit之前就flag改成1

#3


satty说的对

#4


建立一个会话型变量进行跟踪就可以了

#5


典型的做法是所谓的令牌系统,为每个可能提交的窗体放一个唯一的id(所谓令牌,比如放在hidden里),服务器端(session)有一个令牌队列,存放所用提交过的窗体,每次收到提交上来的窗体,把它的令牌和队列中已经存在的令牌进行比较,判断合法性。

#6


用js来解决吧
第一种方法
onclick之后把提交表单的button disabled掉,这样就没办法点了
,这个方法有bug就是,选中表单中任意一项,通过回车提交表单还是可以的,
part_time(helpme) 的方案也存在这个问题

第二种方法
onclick之后用dhtml在页面上放一个透明的div,让用户没办法选中表单项,bug是一开始就用回车提交

第三种方法
用dthml的behavior给form附着一个htc,在htc中保证表单提交前,都会放div,这种方法比较复杂,要对js很熟悉

nielinjie的方法有一个问题,表单不能重复提交是指这个表单正在提交的过程中不能再一次提交,如果这个表单信息已经被提交,回复的消息已经到客户端了,这个表单当然可以再提交拉,那么你什么时候去清空那个session,什么时候去加令牌呢?,如果在信息还没有传到服务器,又提交了一次怎么办?

ps,顺便说一句,jarkata的struts不能解决这个问题

#7


我用的方法和上面 part_time的方法差不多
但是因为我的本机就是服务器,几乎没有任何延迟就可以提交了。
stellaxyq的建议似乎更有道理,我也希望能有JS就能解决问题。
只是前2种方法理解了,第3种方法还不明白如何做???

如果用 nielinjie所描述的令牌系统,是不是还应该产生随机数作为令牌?能比较详细地解释一下实现方法?

#8


用js来解决吧
第一种方法
onclick之后把提交表单的button disabled掉,这样就没办法点了
,这个方法有bug就是,选中表单中任意一项,通过回车提交表单还是可以的,
part_time(helpme) 的方案也存在这个问题

<form name="form1" onsubmit="return false;">
其中onsubmit="return false;"就是用来防止通过回车提交表单.

#9


回楼上的各位:比如我有一个表单form1,我放一个令牌form1_1234345(server端产生,放在html中,后一段是某一个唯一id数,可以用时间等),然后用户填form。server每遇到一个form上来,就看看它的令牌。比如应用中form提交的顺序应该是form1,form2的顺序。而当前session中已经有令牌form1_xxxxx(说明用户已经提交过form1),再提交上来令牌为form1_xxxxx的form的话,明显是重复提交,如果是form2_xyxyx的话,应该是合法的(当然可以在这里加入复杂的逻辑。)(特殊情况,如果是form1_yyyyy,的话,可以自己判断,因为有的情况下连续提交两次同样类型的form不一定是重复提交,可能程序确实需要提交两次……)
如果还有不清楚,可以mail:nielinjie@erry.com

#10


客户端的方法有可能不安全和不灵活的。
比如stella姐:我如果提交后用goback键(或者还要刷刷屏),disable的键还disable着么?
我说的方法可以严格的控制客户的状态流,同时可以和state,strategy等等pattern联系起来。refactring,需求修改之类的比较方便。

#11


现在似乎重复提交的概念似乎不太清楚

#12


用goback键会使页面重置
所以问题不存在
不过nielinjie说得也有道理,客户端可能是不安全的,不灵活嘛,呵呵
就要看谁写了
我们现在用的小雨的机制还是很灵活的
下次给你看代码

#13


其实上面说的方法,如果真的是商业应用的话,可能要复杂很多
要做很多别的限制等等
我们的方法是所有的back键的对流程有影响的键都会屏蔽掉
防止重复提交是写了一个htc来控制window的状态
在某一种状态下,不能对window做任何表单上的操作等等
具体是十分复杂的
而且对js人员的要求非常高,而且还要考虑客户操作性上的一些东西
:)

#14


谢谢楼上各位。
收获真的很大!
准备结贴。

#15


差点忘了问--- stellaxyq(汐) ,
小雨的机制是什么,请介绍一下!

#16


偶倾向于在server端完成一切比较放心……
呵呵,不过对stella姐姐越来越敬佩了……:),等我回来认真学习一下下。

#17


“可以和state,strategy等等pattern联系起来。refactring,需求修改之类的比较方便。”应该是选择方法时重要的考虑方面。

#18


要控制商业逻辑的话,个人认为js可能力不从心,主要是系统的可扩展和可维护性大大降低。

#19


gz

#1


<form name="form1" onsubmit="return false;">
<input type="hidden" name="submitFlg" value="0">
<input type="button" value="提交" onclick="mySubmit();">
</form>
<script>
function mySubmit() {
  if (document.form1.submitFlg == 0) {
    document.form1.submit();
    document.form1.submitFlg == 1;
  }
}
</script>

#2


好像不行吧
应该在submit之前就flag改成1

#3


satty说的对

#4


建立一个会话型变量进行跟踪就可以了

#5


典型的做法是所谓的令牌系统,为每个可能提交的窗体放一个唯一的id(所谓令牌,比如放在hidden里),服务器端(session)有一个令牌队列,存放所用提交过的窗体,每次收到提交上来的窗体,把它的令牌和队列中已经存在的令牌进行比较,判断合法性。

#6


用js来解决吧
第一种方法
onclick之后把提交表单的button disabled掉,这样就没办法点了
,这个方法有bug就是,选中表单中任意一项,通过回车提交表单还是可以的,
part_time(helpme) 的方案也存在这个问题

第二种方法
onclick之后用dhtml在页面上放一个透明的div,让用户没办法选中表单项,bug是一开始就用回车提交

第三种方法
用dthml的behavior给form附着一个htc,在htc中保证表单提交前,都会放div,这种方法比较复杂,要对js很熟悉

nielinjie的方法有一个问题,表单不能重复提交是指这个表单正在提交的过程中不能再一次提交,如果这个表单信息已经被提交,回复的消息已经到客户端了,这个表单当然可以再提交拉,那么你什么时候去清空那个session,什么时候去加令牌呢?,如果在信息还没有传到服务器,又提交了一次怎么办?

ps,顺便说一句,jarkata的struts不能解决这个问题

#7


我用的方法和上面 part_time的方法差不多
但是因为我的本机就是服务器,几乎没有任何延迟就可以提交了。
stellaxyq的建议似乎更有道理,我也希望能有JS就能解决问题。
只是前2种方法理解了,第3种方法还不明白如何做???

如果用 nielinjie所描述的令牌系统,是不是还应该产生随机数作为令牌?能比较详细地解释一下实现方法?

#8


用js来解决吧
第一种方法
onclick之后把提交表单的button disabled掉,这样就没办法点了
,这个方法有bug就是,选中表单中任意一项,通过回车提交表单还是可以的,
part_time(helpme) 的方案也存在这个问题

<form name="form1" onsubmit="return false;">
其中onsubmit="return false;"就是用来防止通过回车提交表单.

#9


回楼上的各位:比如我有一个表单form1,我放一个令牌form1_1234345(server端产生,放在html中,后一段是某一个唯一id数,可以用时间等),然后用户填form。server每遇到一个form上来,就看看它的令牌。比如应用中form提交的顺序应该是form1,form2的顺序。而当前session中已经有令牌form1_xxxxx(说明用户已经提交过form1),再提交上来令牌为form1_xxxxx的form的话,明显是重复提交,如果是form2_xyxyx的话,应该是合法的(当然可以在这里加入复杂的逻辑。)(特殊情况,如果是form1_yyyyy,的话,可以自己判断,因为有的情况下连续提交两次同样类型的form不一定是重复提交,可能程序确实需要提交两次……)
如果还有不清楚,可以mail:nielinjie@erry.com

#10


客户端的方法有可能不安全和不灵活的。
比如stella姐:我如果提交后用goback键(或者还要刷刷屏),disable的键还disable着么?
我说的方法可以严格的控制客户的状态流,同时可以和state,strategy等等pattern联系起来。refactring,需求修改之类的比较方便。

#11


现在似乎重复提交的概念似乎不太清楚

#12


用goback键会使页面重置
所以问题不存在
不过nielinjie说得也有道理,客户端可能是不安全的,不灵活嘛,呵呵
就要看谁写了
我们现在用的小雨的机制还是很灵活的
下次给你看代码

#13


其实上面说的方法,如果真的是商业应用的话,可能要复杂很多
要做很多别的限制等等
我们的方法是所有的back键的对流程有影响的键都会屏蔽掉
防止重复提交是写了一个htc来控制window的状态
在某一种状态下,不能对window做任何表单上的操作等等
具体是十分复杂的
而且对js人员的要求非常高,而且还要考虑客户操作性上的一些东西
:)

#14


谢谢楼上各位。
收获真的很大!
准备结贴。

#15


差点忘了问--- stellaxyq(汐) ,
小雨的机制是什么,请介绍一下!

#16


偶倾向于在server端完成一切比较放心……
呵呵,不过对stella姐姐越来越敬佩了……:),等我回来认真学习一下下。

#17


“可以和state,strategy等等pattern联系起来。refactring,需求修改之类的比较方便。”应该是选择方法时重要的考虑方面。

#18


要控制商业逻辑的话,个人认为js可能力不从心,主要是系统的可扩展和可维护性大大降低。

#19


gz

#20