前两种是利用javascript
后面一种是在使用Struts的情况下的参考实现:
javascript 设置一个变量只允许提交一次
<script language=javascript> var checkSubmitFlg = false; function checkSubmit() { if (checkSubmitFlg == true) { return false; } checkSubmitFlg = true; return true; } documentondblclick = function docondblclick() { windoweventreturnValue = false; } documentonclick = function doconclick() { if (checkSubmitFlg) { windoweventreturnValue = false; } }</script><html:form action=myActiondo method=post onsubmit=return checkSubmit();>
还是javascript将提交按钮或者image置为disable
<html:form action=myActiondo method=post onsubmit=getElById(submitInput) disabled = true; return true; > <html:image styleId=submitInput src=images/ok_bgif border= /> </html:form>
利用struts的同步令牌机制
利用同步令牌(Token)机制来解决Web应用中重复提交的问题Struts也给出了一个参考实现
基本原理
服务器端在处理到达的请求之前会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较
看是否匹配在处理完该请求后且在答复发送给客户端之前将会产生一个新的令牌该令牌除传给
客户端以外也会将用户会话中保存的旧的令牌进行替换这样如果用户回退到刚才的提交页面并再次
提交的话客户端传过来的令牌就和服务器端的令牌不一致从而有效地防止了重复提交的发生
if (isTokenValid(request true)){ // your code here return mappingfindForward(success);} else{ saveToken(request); return mappingfindForward (submitagain);}
Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的具体实现可以参考TokenProcessor类中的generateToken()方法
//验证事务控制令牌会自动根据session中标识生成一个隐含input代表令牌防止两次提交 在action中
//<input type=hidden name=orgapaclTOKEN // value=aaffdcccae> if (!isTokenValid(request)) errorsadd(ActionErrorsGLOBAL_ERRORnew ActionError(errortransactiontoken)); resetToken(request); //删除session中的令牌
action有这样的一个方法生成令牌
protected String generateToken (HttpServletRequest request) { HttpSession session = requestgetSession(); try { byte id[] = sessiongetId()getBytes(); byte now[] = new Long(SystemcurrentTimeMillis()) toString()getBytes(); MessageDigest md = MessageDigestgetInstance(MD); mdupdate(id); mdupdate(now); return (toHex(mddigest())); } catch (IllegalStateException e) { return (null); } catch (NoSuchAlgorithmException e) { return (null); } }