不知道那个机制
我的方法是这样的首先在form里实现reset()方法,把所有属性=null;
然后在action里,用完form后,做form.reset();OK
我的方法是这样的首先在form里实现reset()方法,把所有属性=null;
然后在action里,用完form后,做form.reset();OK
解决方案 »
- 北京软件公司比较好的有那些啊?
- document 对象是属于jsp中内置的对象 ,还是javascript中的对象?
- 在线等!急 hibernate+tomcat 出的错
- JSF中我处理结束后转到一个页面,这个页在一个文件夹中,和前面的不在一起,但是路径却没变,我在连接中用相对路径,所以找不到这个页了
- 谈谈系统设计师与web services的前景
- 如何手工把entity bean映射到一个表?
- 使用SessionBean返回一个HashSet,HashSet中的对象已经Serializable,但在客户端使用时还是抛出了未Serializable的错误?
- 高分求Struts入门教程
- 新手 请教
- spring boot启动后控制台输出日志乱码
- 如何解析WSDL文件中的ComplexType??复杂类型..
- saveToken防止2次提交的问题
写上
this.saveToken(request);在提交的方法中
用
if (!isTokenValid(request, true)) {
//
}
进行判断是否重复提交
后,表单里面会自动产生这样的隐藏输入表单域
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6602b5d7c9e511229ad845823b2becd2">
提交页面 <input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
value="<%=session.getAttribute("org.apache.struts.action.TOKEN")%>"/>
处理提交的action if(isTokenValid(request,true)){
//commonDataBean.executeUpdate(sql);//处理执行sql语句代码
resetToken(request);
}else{
saveToken(request);
}
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=utf-8" %>
<html:html>
<head><title>Test</title></head>
<body>
<html:form action="/testAction.do" method="post">
<br>
<html:text property="userName"/>
<br>
<html:text property="password"/>
<br>
<html:submit property="submit" value="Submit"/><br>
</html:form>
</body>
</html:html>
----------------------------------------------------------------------------
testAction.javapackage test;
import java.lang.reflect.InvocationTargetException;import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.el.Logger;
import org.apache.commons.logging.*;;public class TestAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Log log = LogFactory.getFactory().getInstance(
this.getClass().getName());
String userName = (String) PropertyUtils.getSimpleProperty(form,"userName");
String password = (String) PropertyUtils.getSimpleProperty(form,"password");
if (userName == null) {
saveToken(request);
return mapping.getInputForward();
}
if (!isTokenValid(request)) {
saveToken(request);
System.out.println("不能重复提交!");
return mapping.getInputForward();
}
System.out.println("添加成功!");
resetToken(request);
return mapping.findForward("success");
}
}
value="<%=session.getAttribute("org.apache.struts.action.TOKEN")%>"/>
把这句原封不动的加到页面的from中
value= " <%=session.getAttribute( "org.apache.struts.action.TOKEN ")%> "/> 写入html,不信你可以自己看下源文件,
问题是Struts的令牌其实是有问题的,多次提交他控制不了,
处理提交的action if(isTokenValid(request,true)){
//commonDataBean.executeUpdate(sql);//处理执行sql语句代码
resetToken(request);
}else{
saveToken(request);
}
这个写法是不对的,现在都在抄来抄去,根本都没自己去试
12楼的说的没错。
第一次重复提交是被阻止了,阻止后saveToken();这时候页面不又有token了嘛,再一次点提交,这时候,真的就重复提交了。所以在isTokenValid(request)为假后不能saveToken();
具体情况如下:
项目是ssh结构,一个模块的跳转和提交在一个action的不同方法中,
link.do?method=postPo是进入提交页面,
link.do?method=editPo是提交信息,
在进入提交页面的方法中应用了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{
//省略保存表单信息代码
resetToken(request);
}
结果一直进入到"提示重复提交的分支中",这是为什么