这是表单重复提交的问题,貌似Sturts有这方面的功能,
Struts中的Token机制能够很好的解决表单重复提交的问题
使用Token的流程
假设用户需要提交一次表单,该表单是submit_info.jsp
1. 进入submit_info.jsp之前,先将请求转发给一个GenerateTokenAction.这个Action的关键代码如下。
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception{
......
//调用Action自带的方法在session和request中存储Token
saveToken(request);
......
}
可以看到这个Action为用户生成一个Token同时存储在session和request中 。
2. 将控制转交到submit_jsp,用户填写相应的提交信息,单击“提交”按钮。该提交触发的是SubmitAction.
3.在SubmitAction中,判断来自用户request中的Token与session中的Token是否是一致,若是一致的则处理请求,并调用resetToken(request)方法,将会话中的session清空,若不一致则提示出错,并调用saveToken(request)创建一个新的Token,然后返回,部分代码如下。
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Excepion{
......
if(isTokenValid(request)){
resetToken(request);
//进行业务处理
}else{
saveToken(request);
//进行出错的处理
。。。。。。
}
。。。。。。
}
4.当用户单击一次提交按钮后,isTokenValid返回True信息,resetToken(requst)方法将当前会话中的Token信息删除,并接下去进行相印的业务处理。
说的含糊,你也可以自己查阅资料Token是怎样防止表单重复提交的
------------------------------------------------------------------------
还可以用javaScript实现表单的重复提交[code]<head>
<script language="javascript">
function formsubmit()
{
Today = new Date();
var NowHour = Today.getHours();
var NowMinute = Today.getMinutes();
var NowSecond = Today.getSeconds();
var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond;
if(mysec-document.formsubmitf.mypretime.value)>600)
{
document.formsubmitf.mypretime.valur = mysec;
}
else
{
alert("请勿反复提交!请耐心等待!谢谢合作!");
return false;
}
document.forms.formsubmitf.submit();
}
</script>
</head>
<body>
<form name="formsubmitf" id="the" method="post" action=".....">
<input type="hidden" name="mypretime" value="0">//传递一个隐藏值,判断是否重复提交
.....
.....
.....
<input type="button" value="提交" name="button1" onclick="formsubmit()">
.....
.....
.....
</form>
</form>
</body> [/code] |