如何处理重复提交呢? struts 重复提交 刷新也重复提交,多次单击提交按钮也重复提交
如何避免重复提交呢? struts 重复提交 刷新也重复提交,多次单击提交按钮也重复提交
如果避免重复提交呢?
请知道的详细说下,或者把文章的链接地址写下也好。
应用环境是tomcat,struts1.2,jsp,hibernate
下面是问题,请看到后能给一个解决方案。
1。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理完毕返回到一个新的列表页面。此时刷新页面,则服务器当作重复提交对待。
2。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理时发生一个异常,于是返回一个错误页面,告诉用户哪个字段有错误,然后用户点击返回按钮,返回上一个页面,再次提交页面时,用户器则把这次的提交当作了重复提交对待。
3。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交,服务器还没有处理完毕时,用户等不及了,再次单击提交按钮,则struts的token机制不会把此当作重复提交,而是会两样处理这次的提交。
这不太好。
其实讨论来讨论去,大家可能忘了最早的目的了:"防止用户在短时间内提交相同的内容", 这不就完了,很明显,这是一个业务需求,解决业务需求的方法只能是写到业务逻辑中去:如
if ( (post.time-lastpost.time)<1S) && (post.content.length()=lastpost.content.length() && post.content.hashcode()=lastpost.content.hashcode() ) throw BuzisException("重复了")
如果要带参数怎么办,,
如果避免重复提交呢?
请知道的详细说下,或者把文章的链接地址写下也好。
应用环境是tomcat,struts1.2,jsp,hibernate
下面是问题,请看到后能给一个解决方案。
1。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理完毕返回到一个新的列表页面。此时刷新页面,则服务器当作重复提交对待。
2。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理时发生一个异常,于是返回一个错误页面,告诉用户哪个字段有错误,然后用户点击返回按钮,返回上一个页面,再次提交页面时,用户器则把这次的提交当作了重复提交对待。
3。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交,服务器还没有处理完毕时,用户等不及了,再次单击提交按钮,则struts的token机制不会把此当作重复提交,而是会两样处理这次的提交。
5 楼
zgqynx
2007-11-16
yyjn12 写道
绝大多数情况是不需要使用token的.
我不知道token适用于什么情况,反正我也没用过.不过我想它既然存在,应该有道理的吧.
重复提交是个经典的老问题了,但是似乎于struts无关吧?你自己直接写jsp,或是servlet,不是照样存在这个问题吗?
这是个对MVC的理解的问题.
做完一个事情,比如处理表单提交,插入了一条记录.之后页面要流转到显示列表的页的时候,应该是一个 redirect,而不是forward.
struts1 的forward 是可以设置的, 好象是 redirect=true,或着是 type=redirect ,具体我忘了.好久没用了.
设置了就自动是redirect了..
楼上,你没有看具体的应用环境,我的应用程序就是使用了struts1.2框架的。而struts又提供了解决这个重复提交的问题的机制。我不知道token适用于什么情况,反正我也没用过.不过我想它既然存在,应该有道理的吧.
重复提交是个经典的老问题了,但是似乎于struts无关吧?你自己直接写jsp,或是servlet,不是照样存在这个问题吗?
这是个对MVC的理解的问题.
做完一个事情,比如处理表单提交,插入了一条记录.之后页面要流转到显示列表的页的时候,应该是一个 redirect,而不是forward.
struts1 的forward 是可以设置的, 好象是 redirect=true,或着是 type=redirect ,具体我忘了.好久没用了.
设置了就自动是redirect了..
6 楼
zsslxy2006
2007-11-17
我们是用了最笨的方法.是针对refresh页面时重复提交的问题.当进入一张表单时往session写个值设为true,提交后在action处理的时候往session里设这个值为false,在方法里判段它为true时才执行数据库等操作.就杜绝了重复提交.
7 楼
hantsy
2007-11-28
两种方法都是可行的
1.使用token
2.forward设置redirect=true
1.使用token
2.forward设置redirect=true
8 楼
eoeac
2007-11-28
forward设置redirect=true有时刷新过快好像还能发生重复提交
token使用起来老是觉着不是十分顺手,但一般处理重复提交还是使用token,心里觉着踏实些
token使用起来老是觉着不是十分顺手,但一般处理重复提交还是使用token,心里觉着踏实些
9 楼
抛出异常的爱
2007-11-28
post 。。。action名。。。
10 楼
zyp731
2007-11-28
1。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理完毕返回到一个新的列表页面。此时刷新页面,则服务器当作重复提交对待。
可采用重定向方式
2。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理时发生一个异常,于是返回一个错误页面,告诉用户哪个字段有错误,然后用户点击返回按钮,返回上一个页面,再次提交页面时,用户器则把这次的提交当作了重复提交对待。
把修改token的状态信息的代码放在保存完信息之后。如果在保存信息之前发生错误,token的信息是不会被清除的。
3。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交,服务器还没有处理完毕时,用户等不及了,再次单击提交按钮,则struts的token机制不会把此当作重复提交,而是会两样处理这次的提交。
和第二个问题一样。
可采用重定向方式
2。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交。然后服务器处理时发生一个异常,于是返回一个错误页面,告诉用户哪个字段有错误,然后用户点击返回按钮,返回上一个页面,再次提交页面时,用户器则把这次的提交当作了重复提交对待。
把修改token的状态信息的代码放在保存完信息之后。如果在保存信息之前发生错误,token的信息是不会被清除的。
3。如果点击一次提交按钮后,服务器开始处理,在后台的代码中使用struts的token机制控制重复提交,服务器还没有处理完毕时,用户等不及了,再次单击提交按钮,则struts的token机制不会把此当作重复提交,而是会两样处理这次的提交。
和第二个问题一样。
11 楼
pany
2007-11-28
或者当点了提交按钮后 使按钮不可用 或者可以在页面加个验证码 如果验证不通过就不跳转么
12 楼
xiaoqiang
2007-11-30
对于这个问题,我觉得在struts1.2时代,处理方法就有了。
但到了struts2.0,则用的是webwork的机制,而且更加成熟
问题1,就不用说了,在struts1.2中,new ActionForward(各参数);
可以指定参数:boolean redirect
问题2,应该加一个异常处理的方法,当发生异常时,重置token的值,即使返回到编辑页面,取得的token值还是原来的,并不会重新生成,所以再次提交,也还是原来的token。这个在webwork中就很方便:加一个异常Interceptor,处理极其方便
问题3,人家手快,没办法,只能把按钮diabled掉
但到了struts2.0,则用的是webwork的机制,而且更加成熟
问题1,就不用说了,在struts1.2中,new ActionForward(各参数);
可以指定参数:boolean redirect
问题2,应该加一个异常处理的方法,当发生异常时,重置token的值,即使返回到编辑页面,取得的token值还是原来的,并不会重新生成,所以再次提交,也还是原来的token。这个在webwork中就很方便:加一个异常Interceptor,处理极其方便
问题3,人家手快,没办法,只能把按钮diabled掉
13 楼
leeking
2007-12-02
不行你就用ajax,象这个论坛一样,页面局部刷新
14 楼
81261686
2007-12-03
提交后把按键去掉
15 楼
watermud
2007-12-21
问题3的解决方法挺巧妙的,呵呵。
16 楼
Jonney
2007-12-22
比较优雅的是redirect-after-post技术。
Webwork或者Struts2对redirect-after-post都有支持,
FlashResult和FlashIntecepter搭配使用。
Stripes里面也有个Flash类型的result。
Webwork或者Struts2对redirect-after-post都有支持,
FlashResult和FlashIntecepter搭配使用。
Stripes里面也有个Flash类型的result。
17 楼
pypg
2008-01-03
刚好用到,收下了。
呵呵,不错技巧。
呵呵,不错技巧。
18 楼
drinkjava
2008-01-20
81261686 写道
提交后把按键去掉
这不太好。
其实讨论来讨论去,大家可能忘了最早的目的了:"防止用户在短时间内提交相同的内容", 这不就完了,很明显,这是一个业务需求,解决业务需求的方法只能是写到业务逻辑中去:如
if ( (post.time-lastpost.time)<1S) && (post.content.length()=lastpost.content.length() && post.content.hashcode()=lastpost.content.hashcode() ) throw BuzisException("重复了")
19 楼
pacer123
2008-02-19
通过js控制,提交后将提交按钮所在的table块 通过
document.forms[0].submitType.value = v;
var v = document.getElementById(t);
v.innerHTML = "数据提交中...";
这种方式替换掉就ok了
document.forms[0].submitType.value = v;
var v = document.getElementById(t);
v.innerHTML = "数据提交中...";
这种方式替换掉就ok了
20 楼
My_Choice
2008-03-25
forward设置redirect=true是最简单的设置了也是最容易想到的啊
21 楼
javaxy
2008-04-02
弄个验证码也可以解决这个问题吧?!
22 楼
sheqiguo
2008-04-03
网上一堆。。搜搜。。struts2有防重复提交的。。
23 楼
devil_javaMode
2008-04-17
My_Choice 写道
forward设置redirect=true是最简单的设置了也是最容易想到的啊
如果要带参数怎么办,,
24 楼
Fly_m
2008-04-18
直接把参数带到后面算了,forward + 参数,action中将参数全部取出,再全部追加至url后面.
或者说将临时数据保存至session中(token就是这样吧),保存之后将session中数据去掉.不知道这个如何?
或者说将临时数据保存至session中(token就是这样吧),保存之后将session中数据去掉.不知道这个如何?