`
sunxboy
  • 浏览: 2869112 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Web应用中避免Form重复提交的三种方案(转)

阅读更多

前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现

# 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);
          }
      }  

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Web应用中避免Form重复提交的三种方案

    ### Web应用中避免Form重复提交的三种方案 #### 一、使用JavaScript预防重复提交 **1. 设置变量标记** 为了防止表单重复提交,可以通过JavaScript设置一个全局变量,该变量用作标记,确保表单只能被提交一次。...

    JSP避免Form重复提交的三种方案

    在Web开发中,尤其是使用JavaServer Pages (JSP...通过以上三种方式,我们可以有效地防止JSP表单的重复提交,确保Web应用的数据一致性,并减少服务器不必要的负载。选择哪种方法取决于项目的具体需求和所使用的技术栈。

    试谈在Web应用中如何避免表单的重复提交.pdf

    如何避免Web应用中的表单重复提交 在Web应用中,避免表单的重复提交是一个棘手的问题。用户在提交表单时可能因为网络速度的原因,或者网页被恶意刷新,导致同一条记录重复插入到数据库中。这篇文章将探讨如何从...

    8 种方案解决重复提交问题

    重复提交问题是指在Web应用程序中,当用户提交表单时,可能会导致重复提交,导致数据不一致和其他问题。为了解决这个问题,我们可以使用多种方法,包括前端JS提交禁止按钮、Post/Redirect/Get模式、Session中存放...

    使用struts的同步令牌避免form的重复提交

    为了有效地防止Web应用程序中的表单重复提交问题,Struts框架提供了一种简单而强大的解决方案——同步令牌模式(Synchronization Token Pattern, STP)。下面详细介绍如何在Struts项目中实现这一功能。 1. **生成...

    ASP.NET中防止刷新页面造成表单重复提交

    在Web应用程序开发中,特别是在使用ASP.NET进行网站构建时,一个常见的问题是表单重复提交。这通常发生在用户通过按下浏览器的F5键来刷新页面的情况下,此时之前的表单数据会被再次提交到服务器端。这不仅可能导致...

    Servlet、Struts、SpringMVC对于表单重复提交的解决方案

    在Servlet中,通常采用几种方法来避免重复提交: 1. **Session状态管理**:在接收到用户提交请求后,可以在Session中设置一个标志,如"formSubmitted",然后在后续的请求中检查这个标志,如果已存在则忽略请求。 2...

    修改禁止多次重复提交

    在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...

    不能重复提交

    通过以上分析,我们可以看出在Web应用开发中,合理地设计和实现表单提交机制以及有效地防止重复提交是非常重要的。Struts框架提供了一套完整的解决方案,使得开发者能够更加方便快捷地实现这一功能。当然,在实际...

    struts2防止表单重复提交--重定向

    在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或处理逻辑的混乱。Struts2提供了多种方法来防止这种情况,其中一种是通过重定向来实现。下面将详细解释Struts2如何通过重定向来防止表单重复提交。 ...

    Struts2防止重复提交的解决方案

    在Web应用程序开发中,一个常见的问题是如何有效地防止表单的重复提交。这不仅能够提高用户体验,还能增强系统的安全性。Struts2作为一款广泛使用的Java Web应用框架,提供了多种方式来解决这一问题。 #### 二、...

    JSP_重复提交_解决方法

    在Web应用程序开发中,尤其是在使用Java Server Pages (JSP)技术时,一个常见的问题是重复提交数据。当用户不小心刷新了页面或按下了浏览器的“后退”按钮时,可能会导致同一份数据被提交多次,从而对数据库造成不必...

    jsp项目放置表单重复提交

    在Web开发中,表单重复提交是一个常见的问题,它可能导致数据不一致,服务器资源浪费,甚至用户困扰。...通过这些方法,我们可以有效地保护Web应用免受潜在的重复提交问题的影响,确保数据的准确性和系统稳定性。

    一个注解解决页面重复提交

    在网页应用中,用户可能会因误操作...结合自定义拦截器,我们可以创建一个健壮的防重复提交系统,适应各种复杂的Web应用场景。同时,这种解决方案也适用于其他编程语言和框架,只要它们支持类似的功能注解和拦截机制。

    Struts解决重复提交步骤

    在Web应用开发中,表单重复提交问题一直是困扰开发者的一个常见问题。特别是在一些涉及敏感操作如订单提交、支付确认等场景下,避免重复提交尤为重要。Struts框架作为Java Web应用开发的经典框架之一,提供了一套...

    Struts2 表单 重复提交

    "防止表单重复提交 token"是Struts2提供的一种解决方案,通过在请求中加入一个唯一的token来确保请求的唯一性和一致性。 首先,我们来看如何实现这个机制。在Struts2中,我们可以使用拦截器(Interceptor)来实现...

    thinkphp3.2 防止表单重复提交

    总的来说,防止表单重复提交是保障Web应用数据一致性的重要手段。ThinkPHP 3.2 的表单令牌机制提供了一种简便且安全的解决方案。在实际开发中,应结合项目需求选择合适的防重策略,确保用户体验和数据安全性。

    Struts表单重复提交问题

    Struts框架是一个经典的Java Web开发框架,用于构建MVC(模型-视图-控制器...在实际开发中,除了Struts的令牌机制,还可以结合前端的解决方案,如禁用提交按钮、使用AJAX异步提交等,来进一步增强防止重复提交的效果。

Global site tag (gtag.js) - Google Analytics