求助,为防止重复提交应用了saveToken(request),一直失败,是否应用有限制?
我今天为了防止重复提交应用了saveToken(request),结果一直无易做图常使用,只提交一次信息的时候也提示不能重复提交,具体情况如下:
项目是ssh结构,一个模块的跳转和提交在一个action的不同方法中,
link.do?method=postPo是进入提交页面,
link.do?method=editPo是提交信息,
在进入提交页面的方法中应用了saveToken(request);
saveToken(request);
if(isTokenValid(request,true)){
System.out.println("应用saveToken成功");
}
else{
System.out.println("应用saveToken失败");
}
在提交方法中做判断,如果重复提交输出错误信息
if(!isTokenValid(request,true)){
System.out.println("//////////////////////");
ActionMessages error = new ActionMessages();
saveErrors(request, error);
return new ActionForward("/link.do?method=postPo");
}
else{
//省略保存表单信息代码
resetToken(request);
}
结果一直进入到"提示重复提交的分支中",进入编辑页面前tomcat中输出"应用saveToken"失败的信息,这是为什么,跟项目框架结构有关系吗,各位高手有没有遇到过这种情况
--------------------编程问答-------------------- 没人理啊,有高手指点一下呗 --------------------编程问答-------------------- 你分太少了。不告诉你。下次分给多点 --------------------编程问答-------------------- 把提交页面的方法中的以下部分删除!
if(isTokenValid(request,true)){
System.out.println("应用saveToken成功");
}
else{
System.out.println("应用saveToken失败");
} --------------------编程问答-------------------- if(isTokenValid(request,true)){
System.out.println("应用saveToken成功");
}
else{
System.out.println("应用saveToken失败");
}
这部分是失败后调试的时候加上去的,感觉第一步跳转的时候saveToken(request)就没有成功,也无从进行下一步提交数据是进行判断了 --------------------编程问答-------------------- 跳转时saveToken(request)成功的话tomcat中应该打印应用“saveToken成功”,结果一直打印“"应用saveToken失败” --------------------编程问答-------------------- isTokenValid(request,true)不只是判断Token是否有效,它还有删除session中的token的动作,所以进入提交页面的方法中绝对不能用它,否则saveToken无效,而提交页面中还有保留的hide属性,所以只提交一次信息的时候也提示不能重复提交。
先理解session再用它吧 --------------------编程问答--------------------
已经把进入提交页面之前的跳转的方法中的if(isTokenValid(request,true)删除了,还是提示不能重复提交啊 --------------------编程问答-------------------- 重復提交button,用jquery控制不妨試試 --------------------编程问答--------------------
什么意思,jsp页面还用处理吗?
现在的提交按钮:
<input name="Submit" type="submit" class="button_2" value="确定" />直接提交form表单不可以吗 --------------------编程问答--------------------
你得這個我沒用過,我得意思是,jquery控制重復提交button很容易,如果你願意,可以試試。 --------------------编程问答--------------------
谢谢提醒,js控制的重复提交我知道,不过现在眼前遇到这个问题就想解决了,不想跳过去,呵呵 --------------------编程问答-------------------- 为防止重复提交
提交后按钮变为不可用就可以了啊 --------------------编程问答--------------------
想用token的方法实现一下看看,研究一下 --------------------编程问答--------------------
感觉用js和token的方法对恶意提交都不太保险,上网查了一下,不说js了,token对同时开两个窗口一起提交好像也不太好使 --------------------编程问答-------------------- 在进入提交页面的方法中应用了saveToken(request);
saveToken(request);
在提交方法中做判断,如果重复提交输出错误信息
if(!isTokenValid(request,true)){
System.out.println("//////////////////////");
ActionMessages error = new ActionMessages();
saveErrors(request, error);
return new ActionForward("/link.do?method=postPo");
}
else{
//省略保存表单信息代码
}
原因:调用saveToken方法,创建一个新的令牌,并将令牌值保存在当前HttpSession中(新创建的),Action接着把请求转发给提交信息jsp页面,提交信息页面<html:form>标签自动判断在session范围内是否存在Token,如果存在,就自动在表单中生成一个包含Token信息的隐藏字段,例如:
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="....">在用户提交表单后,由Action处理请求.在Action中,调用isTokenValid方法,判断当前用户会话中的令牌值和请求参数中的令牌值是否匹配.如果匹配,就调用resetToken方法,删除Token,然后执行插入数据操作.如果不匹配,返回相关错误提示,进行相关操作.
你的问题出现在(1)if(isTokenValid(request,true)){System.out.println("应用saveToken成功");}
else{System.out.println("应用saveToken失败");}在请求参数中没有令牌值,所以永远为false;(2)else{//省略保存表单信息代码
resetToken(request);} isTokenValid(request,true)不只是判断Token是否有效,它还有删除session中的token的动作,你又resetToken(request)多余的代码,介意你改为saveToken()从新创建一个Token;
--------------------编程问答-------------------- 重复提交 可以用 灰掉按钮处理吧? --------------------编程问答-------------------- 鼓捣半天jsp页面上加了个隐藏域
<input type="hidden" name="<%=Constants.TOKEN_KEY%>" value="<%=session.getAttribute(Globals.TRANSACTION_TOKEN_KEY)%>"/>
才搞定,教程也也没提jsp页面还需要处理啊,网上资料也说是自动生成隐藏域,不知道为什么这么做,郁闷中
--------------------编程问答-------------------- 在你的JSP页面中添<%
org.apache.struts.util.TokenProcessor.getInstance().saveToken(
request);
%> --------------------编程问答--------------------
加在哪啊?页面中任意位置吗 --------------------编程问答--------------------
亲 你页面的应该没有用<html:form 用的可能是<form 所以才不能自动生成隐藏域~ --------------------编程问答-------------------- 楼主你在提交之后把Token重置了没?也就是 resetToken(request);//重置 --------------------编程问答-------------------- 进入提交页面的方法中应用了saveToken(request);
if(isTokenValid(request,true)){
System.out.println("应用saveToken成功");
}
else{
System.out.println("应用saveToken失败");
}
进入页面不需要判断只在提交页面判断下就行了
补充:Java , Web 开发