1 js验证方法(js 判断防止form重新提交)
1.1 在页面中设置一个隐藏域值判断
<input type="hidden" value="false" name="server"/>
如果已经POST OK 过, 就改变 value="true" ;
再次POST 时候,可以用 JS 在客户端判断 hidden , 也可以在SERVER 检查.
1.2 在页面中设置一个变量判断
<script language="javascript">
var checkSubmitFlg = false;
function checkSubmit() {
if (checkSubmitFlg == true) {
return false;
}
checkSubmitFlg = true;
return true;
}
document.ondblclick = function docondblclick() {
window.event.returnValue = false;
}
document.onclick = function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false;
}
}
</script>
<html:form action="myAction.do" method="post" οnsubmit="return checkSubmit();">
1.3 将提交按钮或者image置为disable
如 <html:form action="myAction.do" method="post"
οnsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
</html:form>
<input type="button" value="提交" οnclick="this.disabled=true;this.form.submit()">
2 清空缓存防止提交
<META HTTP-EQUIV="pragma " CONTENT= "no-cache ">
<META HTTP-EQUIV= "Cache-Control " CONTENT="no-cache, must-revalidate ">
<META HTTP-EQUIV= "expires " CONTENT= "Wed, 26 Feb 1997 08:21:57 GMT ">
3 session令牌方式
生成一个令牌保存在用户session中,在form中加一个hidden域,显示该令牌的值,form提交后重新生成一个新的令牌,将用户提交的令牌和session中的令牌比较,如相同则是重复提交
说简单点,防止重复提交的原理就是在服务端和在客户端同时存在一个Token,当客户端发送一个request到服务端的时候,包含这个token的信息,当然,这个请求同样会包含当前的sessionID,
当请求到达服务端的时候,服务端用过sessionID去得到当前的session,并且在该session中查找改Token,并且与request中所包含的Token进行比较,如果相同责为有效请求,在请求有效之前从session将该Token删除,这样,如果重复提交,则为无效请求.
用一段代码来表示吧.
首先定义两个变量
public static String TOKEN_FOR_SESSION="token.for.session";
public static String TOKEN_FOR_REQUEST="token.for.request";
考虑add这个方法需要防止重复提交,因此在add发出的这个request的时候,一定需要包含这个TOKEN,
因此,需要增加一个toAdd这样一个方法,在这个方法中,转向add这个页面,而toAdd这个方法中的概要代码:
String token=getToken();
request.setAttribute(TOKEN_FOR_REQUIRED,token);
session.setAttribute(TOKEN_FOR_SESSION,token);
request.getRequestDispatcher("/add.jsp").forward(request,response);
在add.jsp中包含如下信息:
<input type="hidden" value="${token.for.request}"/>
在add的action处理中:
String savedToken=request.getSession().getAttribute(TOKEN_FOR_SESSION).toString();
String requestToken=request.getParameter(TOKEN_FOR_REQUEST);
request.getSession().removeAttribute(TOKEN_FOR_SESSION);
if(savedToken.equals(requestToken))
{
//TODO:your own business logic.
}
这个就是防止重复提交的概要思想.
4 redirect=true 或者 request.redirect();
重定向可以解决页面刷新带来的数据的重复提交的问题,我们自然可以利用重定向的方式来解决这个问题。但是struts的action里面mapping.findword()
修改如下:
<action-mappings