使用struts1时令牌重复提交问题
项目中用到了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的可能。在线等答案,大侠们帮帮忙 --------------------编程问答-------------------- 在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")%>" /> --------------------编程问答-------------------- 这样和在action中设置令牌没什么区别吧。 --------------------编程问答-------------------- 提交form用struts1的<html:form> --------------------编程问答-------------------- 跟这个有关系么?我试试。 --------------------编程问答-------------------- 额。。忘了,我本来就是<html:form>提交,不是普通form --------------------编程问答-------------------- button点过之后 让其灰掉 用户不能再点 -_-不过用户刷新就木有办法鸟。 --------------------编程问答--------------------
禁用button事由漏洞的,呵呵。如果按钮禁用,在地址栏中输入:javascript:alert(document.all["search-btn"].disabled=false),按钮就会被开启。。 --------------------编程问答--------------------
刚才试了下 好像不会开启啊 --------------------编程问答-------------------- 应该可以的,我都试过好多次了,呵呵。 --------------------编程问答--------------------
用户刷新就木有办法??????
有办法地:
1,a页面iframe嵌入b页面
2,b页面提交,通过struts处理,转发到c页面
3,c页面的右键菜单给禁止掉,代码:<body oncontextmenu="return false">
用户刷新的按钮就木有了,按键盘的F5刷新的却是a页面
重复提交的问题就解决了,不需要用到struts的令牌机制 --------------------编程问答-------------------- 给你个思路:
第一,前台js最好能控制他不要进行重复点击提交表单,比如将按钮置灰,或是使用初次有效的变量判断;
第二,前台页面中要写好那个struts变量的设置,跟随form其他表单值一起传过去;
第三,自己写个Filter易做图,专门拦截你设定规则的action方法,可以达到代码复用的目的;
第四,就是在filter中的方法判断是关键,这部分是核心,就是进行token变量值和session中保存中上次的token值的比较,如果一样那么说明重复,否则则给与通过;
struts1的token完全可以自己写一套出来,我自己就是这样做的,除了那个表单中的每次都变化的token变量值需要struts来帮我生成,其他的都是自己写的,很好用的,如果你想了解更多的话,可以加我的QQ,417967731.
struts2的token很成熟,直接使用就行了,但是struts2的token变量的值生成机制很频繁很灵敏,如果你自己没有一定的js技术进行控制,那么会给你造成更大的麻烦... --------------------编程问答-------------------- 现在我的做法是前台用户点击提交时,js调用submit前一步让按钮禁用,看看还有没有误报重复提交的问题。没办法了。我们公司产品是struts1的,暂时不敢升级,升级风险很大。 --------------------编程问答-------------------- 都给你回复了 怎么连个分都不给下。 --------------------编程问答-------------------- 首先你要确定,是哪里出了问题,不要对自己的代码这么没有信心嘛
先叫用户情景再现,再找问题不迟。 --------------------编程问答-------------------- 问题就在于这是挂在外网上的,有用户打电话反应,我们没法看到。 --------------------编程问答-------------------- 我又没结贴,结贴时再说,嘿嘿,先谢谢你的回复 --------------------编程问答-------------------- 貌似struts1的token是存在request中的,只能防一次刷新。我用struts2的token易做图还是挺好用的~
补充:Java , Web 开发