struts解决重复提交问题(Token)

首先要在第一次进入到添加用户页面时要使用toAddUser.do的url形式进入

在ToAddUserAction类中实现方法

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

... ...
saveToken(request);//在session中保存token值

... ...
return mapping.findForward("toAddUser");
}

在页面中要使用html:form标签,struts会在该标签的开始执行标签的代码中在form的表单项中加入一个名字为org.apache.struts.taglib.html.TOKEN的hidden类别的一个input值,查看页面的源代码可以看到

<form name="addUserForm" method="post" action="/DADJPT/addUser.do" οnsubmit="return validateForm();" target="_parent">

... ...

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"

value="45dd9d38ebd34db949842fbb7897f3f7">

... ...

</form>

这样的话在提交addUser.do的时候request会携带此变量

在addUserAction中可以判断request中的token值是否跟存放在session中的token一样,不一样得话则转到页面过期的界面,并重置token值,如果相同则执行insert表操作,并也重置token值,并重新回到添加界面

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

AddUserForm addUserForm = (AddUserForm)form;

User user = addUserForm.getUser();

if(idTokenValid(request,true)){

userDao.add(user);

... ...

}else{

saveToken(request);

return mapping.findForward("timeoutPage");

}
return mapping.findForward("toAddUser");
}

这样在按f5刷新后者回退后再提交form将不会进行重复提交



关于在文章开头提到的问题,经测试是因为在页面中使用了<iframe />标签,表单是放在frame标签中的,而提交成功后又回到了添加界面,回退后在外部页面中的org.apache.struts.taglib.html.TOKEN值保持原来的值不变(该值可以通过session.getAttribute("org.apache.struts.action.TOKEN")得到),而在iframe标签中的,在每一个提交成功的页面里面org.apache.struts.taglib.html.TOKEN值都已经刷新为新生成的token值了,所以可以进行有效得提交,在ifrme中body属性onload中加入document.forms[0].getElementsByTagName("input")[0].value = window.parent.document.getElementById("org.apache.struts.taglib.html.TOKEN1").value;并在外部页面中手动加入一个同名的hidden值即可解决
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值