时间: 2021-07-31 作者:daque
1 javascript ,树立一个变量,只承诺提交一次。
<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" onsubmit="return checksubmit();">
2 仍旧javascript,将提交按钮大概image置为disable
<html:form action="myaction.do" method="post"
onsubmit="getelbyid('submitinput').disabled = true; return true;">
<html:image styleid="submitinput" src="http://www.okasp.com/techinfo/images/ok_b.gif" border="0" />
</html:form>
3 运用struts的同步令牌体制
运用同步令牌(token)体制来处置web运用中反复提交的题目,struts也给出了一个参考实行。
基础道理:
效劳器端在处置达到的乞求之前,会将乞求中包括的令牌值与生存在暂时用户对话中的令牌值举行比拟,看能否配合。在处置完该乞求后,且在回复发送给存户端之前,将会爆发一个新的令牌,该令牌除传给存户端除外,也会将用户对话中生存的旧的令牌举行替代。如许即使用户回退到方才的提交页面并再次提交的话,存户端传过来的令牌就和效劳器端的令牌不普遍,进而灵验地提防了反复提交的爆发。
if (istokenvalid(request, true)) {
// your code here
return mapping.findforward("success");
} else {
savetoken(request);
return mapping.findforward("submitagain");
}
struts按照用户对话id和暂时体例功夫来天生一个独一(对于每个对话)令牌的,简直实行不妨参考tokenprocessor类中的generatetoken()本领。
1. //考证工作遏制令牌,<html:form >会机动按照session中标识天生一个隐含input代办令牌,提防两次提交
2. 在action中:
//<input type="hidden" name="org.apache.struts.taglib.html.token"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!istokenvalid(request))
errors.add(actionerrors.global_error,
new actionerror("error.transaction.token"));
resettoken(request); //简略session中的令牌
3. action有如许的一个本领天生令牌
protected string generatetoken(httpservletrequest request) {
httpsession session = request.getsession();
try {
byte id[] = session.getid().getbytes();
byte now[] =
new long(system.currenttimemillis()).tostring().getbytes();
messagedigest md = messagedigest.getinstance("md5");
md.update(id);
md.update(now);
return (tohex(md.digest()));
} catch (illegalstateexception e) {
return (null);
} catch (nosuchalgorithmexception e) {
return (null);
}
}