使用struts1时令牌重复提交问题

莫扎特_Mozart 2012-03-31 01:02:49
项目中用到了struts,为了防止重复提交,就使用struts的令牌来进行控制,给客户发布上去之后,客户反应有很多用户提交资料时都提示请不要重复提交,因为我们也不知道用户到底是怎样操作的,但是不排除用户正常操作下提示重复提交问题。网上搜了很多资料,都没有答案,而且代码也没有问题。有没有哪位大侠遇到这种问题,帮我解决一下,谢谢了。问题解决了给高分。

底下是struts部分代码片段:

if (null != flag && "add".equals(flag)) {
if (true == isTokenValid(request)) {
this.resetToken(request); //4.2释放令牌
try {
do something;
}
catch (Exception ex) {
saveToken(request); //设置防止重复提交的令牌
do something;
}
//传递成功信息,刷新父页面使用
request.setAttribute("SUCCESSFULINFO", this.SUCCESSFLAG);
} else { //4.4 设置重复提交的标志
request.setAttribute("SUCCESSFULINFO", this.REDOFLAG);
} //4.5 转向成功页面
return mapping.findForward(this.DOSUCCESS);
} else { //5、设置防止重复提交的令牌
saveToken(request);
do something;
}

jsp代码按钮使用的是button,在onclick事件中提交,所以应该不存在点击一次访问两次action的可能。在线等答案,大侠们帮帮忙
...全文
328 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsrjwg 2012-04-12
  • 打赏
  • 举报
回复
貌似struts1的token是存在request中的,只能防一次刷新。我用struts2的token拦截器还是挺好用的~
莫扎特_Mozart 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

都给你回复了 怎么连个分都不给下。
[/Quote]我又没结贴,结贴时再说,嘿嘿,先谢谢你的回复
莫扎特_Mozart 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

首先你要确定,是哪里出了问题,不要对自己的代码这么没有信心嘛
先叫用户情景再现,再找问题不迟。
[/Quote]问题就在于这是挂在外网上的,有用户打电话反应,我们没法看到。
莫扎特_Mozart 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

给你个思路:
第一,前台js最好能控制他不要进行重复点击提交表单,比如将按钮置灰,或是使用初次有效的变量判断;
第二,前台页面中要写好那个struts变量的设置,跟随form其他表单值一起传过去;
第三,自己写个Filter拦截器,专门拦截你设定规则的action方法,可以达到代码复用的目的;
第四,就是在filter中的方法判断是关键,这部分是核心,就是进行token变量值和sessi……
[/Quote]现在我的做法是前台用户点击提交时,js调用submit前一步让按钮禁用,看看还有没有误报重复提交的问题。没办法了。我们公司产品是struts1的,暂时不敢升级,升级风险很大。
hanson339751607 2012-04-06
  • 打赏
  • 举报
回复
首先你要确定,是哪里出了问题,不要对自己的代码这么没有信心嘛
先叫用户情景再现,再找问题不迟。
cxw3152 2012-04-06
  • 打赏
  • 举报
回复
都给你回复了 怎么连个分都不给下。
baolong101010 2012-03-31
  • 打赏
  • 举报
回复
给你个思路:
第一,前台js最好能控制他不要进行重复点击提交表单,比如将按钮置灰,或是使用初次有效的变量判断;
第二,前台页面中要写好那个struts变量的设置,跟随form其他表单值一起传过去;
第三,自己写个Filter拦截器,专门拦截你设定规则的action方法,可以达到代码复用的目的;
第四,就是在filter中的方法判断是关键,这部分是核心,就是进行token变量值和session中保存中上次的token值的比较,如果一样那么说明重复,否则则给与通过;

struts1的token完全可以自己写一套出来,我自己就是这样做的,除了那个表单中的每次都变化的token变量值需要struts来帮我生成,其他的都是自己写的,很好用的,如果你想了解更多的话,可以加我的QQ,417967731.

struts2的token很成熟,直接使用就行了,但是struts2的token变量的值生成机制很频繁很灵敏,如果你自己没有一定的js技术进行控制,那么会给你造成更大的麻烦...
s478853630 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 8 楼 的回复:

引用 7 楼 的回复:
引用 6 楼 的回复:

button点过之后 让其灰掉 用户不能再点 -_-不过用户刷新就木有办法鸟。


禁用button事由漏洞的,呵呵。如果按钮禁用,在地址栏中输入:javascript:alert(document.all["search-btn"].disabled=false),按钮就会被开启。。


刚才试了下……
[/Quote]

用户刷新就木有办法??????
有办法地:
1,a页面iframe嵌入b页面
2,b页面提交,通过struts处理,转发到c页面
3,c页面的右键菜单给禁止掉,代码:<body oncontextmenu="return false">
用户刷新的按钮就木有了,按键盘的F5刷新的却是a页面
重复提交的问题就解决了,不需要用到struts的令牌机制
莫扎特_Mozart 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
引用 6 楼 的回复:

button点过之后 让其灰掉 用户不能再点 -_-不过用户刷新就木有办法鸟。


禁用button事由漏洞的,呵呵。如果按钮禁用,在地址栏中输入:javascript:alert(document.all["search-btn"].disabled=false),按钮就会被开启。。


刚才试了下 好像不会开启啊
[/Quote]应该可以的,我都试过好多次了,呵呵。
javamyself 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:

button点过之后 让其灰掉 用户不能再点 -_-不过用户刷新就木有办法鸟。


禁用button事由漏洞的,呵呵。如果按钮禁用,在地址栏中输入:javascript:alert(document.all["search-btn"].disabled=false),按钮就会被开启。。
[/Quote]

刚才试了下 好像不会开启啊
莫扎特_Mozart 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

button点过之后 让其灰掉 用户不能再点 -_-不过用户刷新就木有办法鸟。
[/Quote]

禁用button事由漏洞的,呵呵。如果按钮禁用,在地址栏中输入:javascript:alert(document.all["search-btn"].disabled=false),按钮就会被开启。。
javamyself 2012-03-31
  • 打赏
  • 举报
回复
button点过之后 让其灰掉 用户不能再点 -_-不过用户刷新就木有办法鸟。
莫扎特_Mozart 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

提交form用struts1的<html:form>
[/Quote]额。。忘了,我本来就是<html:form>提交,不是普通form
莫扎特_Mozart 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

提交form用struts1的<html:form>
[/Quote]跟这个有关系么?我试试。
caibird1024 2012-03-31
  • 打赏
  • 举报
回复
提交form用struts1的<html:form>
莫扎特_Mozart 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

在JS破页面中加入如下代码
<%
org.apache.struts.util.TokenProcessor.getInstance().saveToken(
request);
%>
在form总加
<input type="hidden"
name="org.apache.struts.taglib.html.TOKEN"
value="<%=session
.getAtt……
[/Quote]这样和在action中设置令牌没什么区别吧。
cxw3152 2012-03-31
  • 打赏
  • 举报
回复
在JS破页面中加入如下代码
<%
org.apache.struts.util.TokenProcessor.getInstance().saveToken(
request);
%>
在form总加
<input type="hidden"
name="org.apache.struts.taglib.html.TOKEN"
value="<%=session
.getAttribute("org.apache.struts.action.TOKEN")%>" />

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧