在Jsp或Struts如何避免Form重复提交

百里屠苏0193
2013-10-11 · TA获得超过2734个赞
知道小有建树答主
回答量:1085
采纳率:0%
帮助的人:2541万
展开全部
<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="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);? }? } 在更新的时候防止按钮重复点击,主要是用Session来做判断?////////////////////////////////////////////////////////////////////////////////////////////////// 在做一个jsp提交页面时,数据莫名其妙提交2次,数据库数据插入2次,开始只把注意力集中在提交到Servlet里,做了很多测试,折腾半天,才测试出来:根本不是Servlet的问题!问题出在jsp页面上。jsp页面的提交事件导致自动提交了2次。 form表单的js判断函数只返回false,忘记写返回true,真是郁闷死。就像下面这样: function check(){if(""==document.myform.name.value) {//作业名称 window.alert("请先填写作业名称!"); document.myform.name.focus(); $(".name").next().show(); return false; //离开函数}}提交按钮 onclick="javascript:return(checkform());" 上面的check()函数由于缺少return true,导致form表单action重复提交2次。 搜索一下,网上很多人遇到form表单action重复提交2次的问题,原因都是大同小异:如下1. (1)<input type="submit" value="tijiao" onclick="return checkField();"/>或者图片<input type="image" src="../images/btn-login.gif" alt="Login" class="btn-login" onclick="return checkField();"/> (2)if(usernameValue !== "" && passwordValue !== ""){ //document.getElementById_x("loginForm").submit(); 如果写了这行就提交了2次。 return true; }2.jsp页面有些链接地址是""如:<img src="" /> <link type="text/css" href=""/>" rel="stylesheet" /> 主要就是连接不能为空。3. 最近在做一个JAVA项目,发现在登陆页面点击登陆之后都会执行2次ACTION的代码,跟踪了2天终于找到问题的根源: 在登陆页面LOGIN.JSP中,如果提交按钮写成如下的方式则会提交两次: <script type="text/JavaScript"> function loginFunc(){var form = document.getElementById_x("form1"); form.submit();}</script><form action="processLogin.action" method="post" id="form1"> <s:textfield name="username" cssClass="input" style="width:150px;" value=""></s:textfield> <s:password name="password" cssClass="input" style="width:150px;" value=""></s:password> <input type="submit" onclick="loginSystem()"/>//问题出在这一行</form>submit类型本身就会提交到ACTION类;onclick方法中又调用了一次submit提交方法,所以导致执行了两次ACTION的代码。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式