最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > jsp教程

JSP开发中避免Form重复提交的几种方案

日期:11-02    来源:中国设计秀    作者:cnwebshow.com

1 javascript ,设置一个变量,只允许提交一次。 LN1中国设计秀
  <script language="Javascript"> LN1中国设计秀
   var checkSubmitFlg = false; LN1中国设计秀
   function checkSubmit() { LN1中国设计秀
   if (checkSubmitFlg == true) { LN1中国设计秀
   return false; LN1中国设计秀
   } LN1中国设计秀
   checkSubmitFlg = true; LN1中国设计秀
   return true; LN1中国设计秀
   } LN1中国设计秀
   document.ondblclick = function docondblclick() { LN1中国设计秀
   window.event.returnValue = false; LN1中国设计秀
   } LN1中国设计秀
   document.onclick = function doconclick() { LN1中国设计秀
   if (checkSubmitFlg) { LN1中国设计秀
   window.event.returnValue = false; LN1中国设计秀
   } LN1中国设计秀
   } LN1中国设计秀
  </script> LN1中国设计秀
   LN1中国设计秀
  <html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">   LN1中国设计秀
  2 还是javascript,将提交按钮或者image置为disable   LN1中国设计秀
   <html:form action="myAction.do" method="post" LN1中国设计秀
   onsubmit="getElById('submitInput').disabled = true; return true;">    LN1中国设计秀
   <html:image styleId="submitInput" src="images/ok_b.gif" border="0" />  LN1中国设计秀
   </html:form>   LN1中国设计秀
  3 利用struts的同步令牌机制   LN1中国设计秀
  利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。 LN1中国设计秀
  基本原理:  LN1中国设计秀
  服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。  LN1中国设计秀
  if (isTokenValid(request, true)) { LN1中国设计秀
   // your code here LN1中国设计秀
   return mapping.findForward("success"); LN1中国设计秀
  } else { LN1中国设计秀
   saveToken(request); LN1中国设计秀
   return mapping.findForward("submitagain"); LN1中国设计秀
  }  LN1中国设计秀
  Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenPRocessor类中的generateToken()方法。   LN1中国设计秀
  1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交 LN1中国设计秀
  2. 在action中:   LN1中国设计秀
   //<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" LN1中国设计秀
   // value="6aa35341f25184fd996c4c918255c3ae"> LN1中国设计秀
   if (!isTokenValid(request)) LN1中国设计秀
errors.add(ActionErrors.GLOBAL_ERROR, LN1中国设计秀
   new ActionError("error.transaction.token")); LN1中国设计秀
   resetToken(request); //删除session中的令牌   LN1中国设计秀
  3. action有这样的一个方法生成令牌   LN1中国设计秀
   protected String generateToken(HttpServletRequest request) {   LN1中国设计秀
   HttpSession session = request.getSession(); LN1中国设计秀
   try { LN1中国设计秀
   byte id[] = session.getId().getBytes(); LN1中国设计秀
   byte now[] = LN1中国设计秀
   new Long(System.currentTimeMillis()).toString().getBytes(); LN1中国设计秀
   MessageDigest md = MessageDigest.getInstance("md5"); LN1中国设计秀
   md.update(id); LN1中国设计秀
   md.update(now); LN1中国设计秀
   return (toHex(md.digest())); LN1中国设计秀
   } catch (IllegalStateException e) { LN1中国设计秀
   return (null); LN1中国设计秀
   } catch (NoSuchAlgorithmException e) { LN1中国设计秀
   return (null); LN1中国设计秀
   } LN1中国设计秀
   }LN1中国设计秀
 LN1中国设计秀
在更新的时候防止按钮重复点击,主要是用Session来做判断LN1中国设计秀
在jsp/Servlet中可以LN1中国设计秀
JSP页面LN1中国设计秀
<input type="hidden " name=" <% =com.lims.util.SynchroToken.TOKEN_NAME%> " value =" <%= com.lims.util.SynchroToken.getToken(request)%>" > LN1中国设计秀

SynchroToken.javaLN1中国设计秀
package com.lims.util;LN1中国设计秀
import org.apache.struts.util.*;LN1中国设计秀
import javax.servlet.http.*;LN1中国设计秀
import javax.servlet.jsp.*;LN1中国设计秀
import org.apache.struts.action.*;LN1中国设计秀
/**LN1中国设计秀
  * <p>Title: SynchroToken </p>LN1中国设计秀
  * <p>Description: </p>LN1中国设计秀
  * <p>Copyright: Copyright (c) 2004</p>LN1中国设计秀
  * <p>Company: NetStar</p>LN1中国设计秀
  * @author JstarLN1中国设计秀
  * @version 1.0LN1中国设计秀
  * Created in 2004/04/21LN1中国设计秀
  */LN1中国设计秀
public class SynchroToken{LN1中国设计秀
 public final static java.lang.String TOKEN_NAME = "_token";LN1中国设计秀
 public static boolean checkToken (HttpServletRequest request){LN1中国设计秀
   boolean isEqual = false;LN1中国设计秀
   HttpSession session = request.getSession ();LN1中国设计秀
   String formToken = request.getParameter (TOKEN_NAME);LN1中国设计秀
   String sessionToken = (String)session.getAttribute (TOKEN_NAME);LN1中国设计秀
   System.out.println ("formToken: " + formToken + " sessionToken: " +LN1中国设计秀
                       sessionToken);LN1中国设计秀
   if (formToken != null && sessionToken == null){LN1中国设计秀
     session.setAttribute (TOKEN_NAME, formToken);LN1中国设计秀
     isEqual = true;LN1中国设计秀
   }LN1中国设计秀
   return isEqual;LN1中国设计秀
 }LN1中国设计秀
 /**LN1中国设计秀
  * Insert the method's description here.LN1中国设计秀
  * Creation date: (4/19/2004 3:23:25 PM)LN1中国设计秀
  * @return java.lang.StringLN1中国设计秀
  * @param request javax.servlet.http.HttpServletRequestLN1中国设计秀
  */LN1中国设计秀
 public static String getToken (HttpServletRequest request){LN1中国设计秀
   String token = "" + System.currentTimeMillis ();LN1中国设计秀
   HttpSession session = request.getSession ();LN1中国设计秀
   if (session != null){LN1中国设计秀
     session.removeAttribute (TOKEN_NAME);LN1中国设计秀
   }LN1中国设计秀
   return token;zLN1中国设计秀
 }LN1中国设计秀
 /**LN1中国设计秀
  * Insert the method's description here.LN1中国设计秀
  * Creation date: (4/19/2004 3:24:10 PM)LN1中国设计秀
  * @return java.lang.StringLN1中国设计秀
  */LN1中国设计秀
 final static java.lang.String getTOKEN_NAME (){LN1中国设计秀
   return TOKEN_NAME;LN1中国设计秀
 }LN1中国设计秀
 public static String message (PageContext pageContext, String key) throwsLN1中国设计秀
     JspException{LN1中国设计秀
   return RequestUtils.message (pageContext, null, null, key);LN1中国设计秀
 }LN1中国设计秀
}LN1中国设计秀

4 添加中转页面LN1中国设计秀
http://blog.csdn.net/loveyou1999/archive/2007/02/02/1501295.aspxLN1中国设计秀

本文引用地址:/bc/article_46677.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明