JSP(Struts)避免Form重复提交的几种方案

2016-02-19 18:07 14 1 收藏

今天图老师小编给大家展示的是JSP(Struts)避免Form重复提交的几种方案,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - Web开发 】

  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="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/Servlet中可以
  JSP页面
  input type="hidden " name=" % =com.lims.util.SynchroToken.TOKEN_NAME% " value =" %= com.lims.util.SynchroToken.getToken(request)%"  

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  4 添加中转页面
  http://blog.csdn.net/loveyou1999/archive/2007/02/02/1501295.aspx

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

来源:http://www.tulaoshi.com/n/20160219/1616852.html

延伸阅读
如何避免程式重复执行?(侦测是否存在前一副本,若有,则结束目前新启动的程式)。使用者在启动程式后,有时会将程式缩小在工作列上,之后要用时,又会重新启动一次程式,资料库程式有时会因此造成资料错乱!若您不希望使用者重复启动程式,您可以使用APP物件来判断,方法如下: PrivateSubForm_Load() IfApp.PrevInstanceThen'检视前...
标签: Web开发
JSP Struts之HTML标签库详解 Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。  标签库  说明  HTML 标签  用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单  Bean 标签  在访问JavaBeans 及其属性,以及定义一个新的bean 时使用  Logic...
标签: Web开发
今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们。我的开发环境:XP, eclipse,使用GB18030编码。 当遇到这个问题时,到网上去查了好多文章,提到几种解决方案,如:全站UTF-8编码;请求头编码为中文;使用javascript中的escape函数。 使用GET方式提交数据的时候,中文问题很好解决,setrequestheader("Content-Type...
标签: excel
避免Excel重复输入数据的方法   在单位制作员工花名册等表格时,员工的身份证号码应该是唯一的,我们可以通过数据有效性来防止重复输入: 选中需要输入身份证号码的单元格区域(如D2至D101),执行数据→有效性命令,打开数据有效性对话框,在设置标签下,按允许右侧的下拉按钮,在随后弹出的快捷菜单中,选择自定义选项,然后...
标签: Web开发
script function save(){ document.form1.action="right.asp"; document.form1.submit(); } function send(){ document.form1.action="sendtaskook.asp"; document.form1.submit(); } /script form name="form1" input type="button" name="btn1" value="发送" onclick="send();" input type="button" name="btn2" value="保存" onclick="save(...

经验教程

794

收藏

70
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部