`
woshixushigang
  • 浏览: 578435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

struts1防止重复提交

 
阅读更多
防止重复提交java解决 (转载)
B/S结构的软件开发中,特别是在越大型的分布式应用中体现的越明显,后端的处理往往会因为出现较多的时间消耗而引起延迟,这种延迟有可能过长而最终使用户认为是自己的操作错误,导致他们重新提交请求,由于任务的重复提交,服务器资源大部分被占用,情节严重可能出现类似死机现象。
预期达到目标:
1、当用户进行的是Refresh/Reload/Back/Forward操作、以及先Back再Submit操作时,仅仅是reloading先前的结果页。
2、当用户重复提交同一个任务操作时,后台服务接收并处理第一次提交的任务,后面提交不起作用(不转向也不提示)。
3、该功能具有公用性。
基本形成思路:
1、在basic filter中实现公用性
      if(true){//问题1:如何确定是否为重复提交
          ...
          chain.doFilter(request,response);
      }else{
          //问题2:如何实现不转向、不提示也不显示空白页
      }
2、网上资料概括
      a、提交表单后按钮变灰/隐藏提交按钮
      b、在js里设置全局变量,提交后修改该变量的值,依据变量的值判断是否重复提交
          var flag=true;
          function checkForm(){
              if (flag==false){
                  return;
              }
         
              flag=false;
              document.form1.submit();
         
          }
      c、struts (webwork没有找到这个资料)
          //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
          在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中的令牌
         
          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);
            }
         
            }    
      d、用户使用浏览器时,可以经常使用向后的按钮,因此就有可能重复提交一个他们已经提交过的form,这样就会带来一个重复事务处理的问题。同样,一个用户也可能在接收到一个确认的页面之前按下停止的按钮,接着再次提交同一个form。对于这些情况,我们都想跟踪并且禁止这些重复的提交,我们可以使用一个控制servlet来提供一个控制点,以解决这个问题。
        同步记号(Synchronizer (or Dvu) Token)
     
        这个策略是为了解决重复的form提交问题。一个同步的记号被设置在一个用户的Session中,并且包含在返回到客户的每一个form中。当form被提交时,form中的同步标记就和Session中的同步标记作对比。在form首次提交的时候,这两个标记应该是一样的。如果标记不一样,那么该form就会禁止提交,一个错误就会返回给用户。在用户提交一个form时,如果按下浏览器中的后退按钮并尝试重新提交同一个form时,标记就会出现不匹配的现象。
     
        另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,
另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,Session中的标记值就会被修改为一个新的值,同时允许提交该form。
         
            你也可以使用这个策略来控制对某些页面的直接访问,就好象上面资源保护中描述的一样。例如,假设一个用户将某个应用的页面A收藏到收藏夹中,而页面A只允许通过页面B和C访问。当用户直接通过收藏夹来访问页面A,这时页面的访问顺序就是不正确的,这样同步标记将处在一个不同步的状态,或者它根本就不存在。不论怎样,访问都被禁止了。
          e、做一个hidden框,名字自己定,提交后得到这个值放入session,提交前判断session是否为空
解决方案:
    1、后台公共类中实现前台的Form中自动生成两个hidden文本功能,一个是作page是否重复提交判断,并由系统自动附上关键值(如struts采用的方案);另一个作为button是否重复提交判断(struts中好像没有)。由后台公共类实现界面两个hidden text自动生成的好处在于公用性。
    2、在basic filter中根据两个hidden text值判断是否为重复提交。
    3、javascript中作一个公共方法,实现功能:如果需要判断是否重复提交,就给第二个hidden text附上关键值,并使该功能不可用。
.
个人感想:
    我相信未来该功能一定会被服务器集成,而不再由开发人员进行编码
分享到:
评论

相关推荐

    Struts2防止重复提交解决方案

    在Struts2中,防止重复提交是一个重要的问题,因为它可能导致数据不一致性和服务器资源的浪费。本文将详细介绍如何在Struts2中解决这个问题,以及相关的技术概念。 首先,我们要理解Struts2中的拦截器(Interceptor...

    struts2 防止表单重复提交的例子

    Struts2框架提供了一种解决方案,即使用Token机制来防止表单的重复提交。以下是对这个主题的详细说明: 1. **表单重复提交问题**:当用户在提交表单时,由于网络延迟或用户误操作,可能会导致同一个表单被多次提交...

    struts2防止重复提交和等待画面

    struts2 防止 重复 提交 和 等待 画面

    struts2利用token防止表单重复提交(源代码)

    struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...

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

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

    struts2防止重复提交

    Struts2的Token插件是防止重复提交的一种常见方法。这里的"Strut2Token"很可能是指这个插件的应用。它的工作原理是在用户提交表单时生成一个唯一的令牌,并将其存储在服务器端(例如Session)和客户端(通常是隐藏...

    Struts2 防重复提交Demo

    Struts2是一个流行的Java Web框架,它为开发者...通过上述步骤,Struts2的`s:token`标签可以帮助开发者有效地防止重复提交,保证Web应用程序的数据一致性。理解并正确使用这个功能,可以提升应用的健壮性和用户体验。

    通过xml配置搞定Struts重复提交问题

    在Struts的配置文件(例如`struts.xml`)中,为需要防止重复提交的Action添加一个拦截器栈,包括`token`和`tokenSession`拦截器。 ```xml &lt;!-- 配置错误结果页面 --&gt; &lt;param name="includeParams"&gt;none ...

    struts2令牌解决页面重复提交问题

    Struts2是一个流行的Java web框架,它...总的来说,Struts2的令牌机制是通过生成和验证令牌来防止重复提交和CSRF攻击的有效方式。开发者应当理解其工作原理,并在需要的地方正确使用,以提高应用程序的安全性和稳定性。

    struts2中防止重复提交的方法

    在Struts2框架中,防止重复提交是一个重要的安全性考量,因为重复提交可能导致数据不一致性和资源浪费。在上述描述中,给出了三种主要方法来解决这个问题: 1) **使用 `&lt;s:token&gt;` 标签** Struts2 提供了一个称为 ...

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

    服务器端检查这个令牌,如果已经存在,就拒绝处理请求,从而防止重复提交。 - **Session属性**:在Action中设置一个session属性,表示表单已提交。当检测到该属性已存在时,忽略后续的提交请求。 - **客户端验证**...

    解决Struts重复提交

    Struts2提供了一种基于Token的防止重复提交策略。在表单提交时,服务器会生成一个唯一的Token并将其存储在Session中,同时将Token放入到表单中。当用户提交表单时,服务器会检查提交的Token是否与Session中的Token...

    struts token 防止页面刷新,重复提交

    为了避免这种情况的发生,Struts框架提供了内置的Token机制来防止重复提交。 #### 一、Token机制原理 Token机制是一种常见的防止重复提交的方法,其核心思想是为每一次表单提交生成一个唯一的Token值,并将这个...

    Struts2解决表单重复提交

    在Web应用中,表单重复...开发者在使用时需要注意配置token相关标签和拦截器,并通过设置正确的结果视图跳转类型来防止因刷新页面导致的重复提交。通过这些方法的合理应用,可以有效地提高Web应用的健壮性和用户体验。

    Struts2防止表单重复提交示例

    在Struts2中防止表单重复提交的过程主要包括以下几个步骤: 1. **生成Token**:当用户发起表单请求时,服务器会生成一个唯一的Token并将其存储在服务器的会话(Session)中,同时将这个Token作为隐藏字段放入到HTML...

    Struts2 表单 重复提交

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

    Struts解决重复提交步骤

    令牌机制是Struts框架用于防止表单重复提交的一种手段。其基本原理是在客户端与服务器之间传递一个随机生成的唯一标识符(即令牌),通过对比客户端提交时携带的令牌与服务器端存储的令牌是否一致来判断请求是否有效...

    解决在struts 中可以通过token 来重复提交的问题

    ### 解决Struts中通过Token防止重复提交的问题 在Web应用程序开发中,特别是基于MVC架构的框架如Apache Struts中,确保用户操作的安全性是非常重要的。其中一项常见且重要的安全措施是防止表单的重复提交。本文将...

Global site tag (gtag.js) - Google Analytics