防止重复提交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里设置全局变量,提交后修改该变量的值,依据变量的值判断是否重复提交
c、struts (webwork没有找到这个资料)
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附上关键值,并使该功能不可用。
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没有找到这个资料)
//验证事务控制令牌,会自动根据session中标识生成一个隐含input代表令牌,防止两次提交 //在action中: 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附上关键值,并使该功能不可用。
发表评论
-
No result defined for action and result input
2014-11-04 00:00 718No result defined for action an ... -
oracle常用函数
2014-09-25 13:52 623oracle常用函数 1.decode(value,if 1 ... -
java 对象之间属性值复制
2014-09-15 13:42 17081, BeanUtils.copyProperties(des ... -
XStream解析下划线出现重复问题
2014-07-17 17:15 1561直接看代码 XStream xs = new XStrea ... -
在eclipse中svn账户或密码错误或想更改用户
2014-04-21 16:26 854删除c:\User\当前登录名\AppData\Roaming ... -
spring3集成quartz2
2014-04-19 14:34 980最近项目中要用到quartz 做job,在网上看了些资料,自己 ... -
oracle与mysql多行合并
2014-04-14 14:59 8251.oracle多行合并一行 效果: SELECT a, ... -
jasperreport报表问题
2014-04-04 17:14 1266今天改报表遇到个问题,从svn拉了个报表下来直接改,改后编译放 ... -
java.lang.IllegalStateException: getOutputStream() has already been called for t
2013-06-04 21:42 1102最近查看apache tomcat日志,发现经常出现一个错误如 ... -
简单的Excel导出
2013-05-28 23:02 1014项目报表要做导出Excel的功能,用了POI,首先要加载POI ... -
sql
2013-04-01 17:20 674sql从一张表的数据更新到另一张表 UPDATE 表B S ... -
javascript获取当前行
2013-01-10 14:53 1384这些天用到了,记下来,说不定将来有用 var td=even ... -
严格的身份证号码验证
2012-12-27 15:26 975<script> function chec ... -
游标的使用
2012-12-06 21:00 909create or replace procedure ... -
存储过程
2012-12-06 19:41 877存储过程 1 CREATE OR REPLACE PRO ... -
oracle创建存储过程和函数
2012-12-06 19:07 1009Oracle创建存储过程、创建函数、创建包 一、Oracle ... -
关于oracle 中的jobs
2012-12-06 15:18 1171先给个小例子吧 create ... -
javascript操作时间总结
2012-11-22 19:57 862时间对象是一个我们经常要用到的对象,无论是做时间输出、时间判断 ... -
tomcat启动时报异常java.lang.Exception: Socket bind failed
2012-11-07 10:57 1578异常如下: 严重: Error starting endpoi ... -
浅谈网页乱码问题分析
2012-10-28 21:33 13381.首先,我要讲一下乱 ...
相关推荐
在IT行业中,尤其是在前端开发领域,防止用户重复提交是一项重要的任务,这有助于避免因网络延迟或用户误操作导致的数据混乱。Element-UI,一个流行的Vue.js组件库,提供了多种方式来处理这个问题。以下是如何在使用...
好友使用vue技术封装了一个专门用于提交表单和下载文件的“防抖按钮”,其实现原理和使用方法看这里 https://blog.csdn.net/PursueExcellence/article/details/103903139。
Spring Boot 防止重复提交是指在用户提交表单或请求时,防止同一客户端在短时间内对同一 URL 的重复提交,从而避免服务器端的处理压力和数据的一致性问题。下面将详细介绍 Spring Boot 防止重复提交实现方法的相关...
在Web开发中,防止用户重复提交是常见的需求,特别是在数据敏感的操作中,如订单确认、用户注册等。自定义标签是一种优雅的解决方法,它能够有效地控制页面的行为,避免因为用户误操作或网络延迟导致的数据重复插入...
然而,这种方法并不能完全防止所有情况下的重复提交,因为某些用户可能使用浏览器的刷新功能或者在网络延迟后多次点击。 ASP.NET MVC框架提供了一些内置机制来处理此问题。例如,可以使用`AntiForgeryToken`辅助...
对于防止用户重复提交表单,可以采取多种方法: 1. 前端限制。使用JavaScript来禁用提交按钮是一个简单有效的方法。一旦用户点击提交,按钮即被禁用,防止用户再次点击。此方法仅能在客户端生效,所以存在局限性,...
在前端开发中,防止用户重复提交是一个常见的需求,特别是在用户可能会因为网络延迟或误操作而多次点击提交按钮的情况下。这可能导致后台接收到多个相同的数据,从而引起数据冗余或者异常。本文将探讨如何使用...
在Web应用开发中,防止用户重复提交表单是一项重要的功能,尤其在涉及到交易、支付等敏感操作时更为关键。重复提交不仅可能导致数据错误,还可能增加服务器负担,甚至引发安全问题。 ### 一、背景介绍 在给定的...
8. **表单重定向(Redirect after Post)**:这是一种经典的防止重复提交的方法,提交表单后立即重定向到新的URL,这样即使用户再次点击提交,也会被重定向页面拦截。 9. **使用HTML5的formnovalidate属性**:对于...
Layui是一种基于jQuery的前端UI框架,它提供了一套丰富的界面元素和组件,广泛...通过上述方法,可以有效地防止用户在表单提交过程中产生的重复提交行为,提升用户的操作体验,确保数据提交的正确性和服务器的稳定性。
在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...
下面将结合实例详细讲解如何在不同的场景中防止用户重复提交数据。 首先,在客户端防止重复提交的一种常见方法是在点击按钮时立即禁用按钮。在***的Web表单中,可以通过设置按钮的`UseSubmitBehavior`属性为`False`...
在现代Web应用开发中,防止表单重复提交是一项重要的任务,因为这可能导致数据不一致性和服务器资源浪费。本文将深入探讨如何使用Spring Boot 2.1、Redis和拦截器来实现这一功能。以下是对这个主题的详细解释: ...
在网页开发中,防止用户重复提交是一个常见的需求,特别是在处理重要的数据交互时,如订单创建、用户注册等。重复提交可能会导致数据冗余或者逻辑错误,因此需要采取措施来避免这种情况。这里,我们通过分析标题、...
为了确保用户在提交表单时不会无意或有意地多次发送请求,我们需要实施有效的防止表单重复提交的策略。以下是一些关键知识点: 1. **表单重复提交的类型**: - **用户行为**:用户可能意外按下刷新按钮,导致已...
在网页应用中,防止页面重复提交是一个重要的安全性与用户体验问题。重复提交可能导致数据不一致,影响系统的稳定性和数据的准确性。本示例"防止页面重复提交demo"将介绍一种结合前端控制与后台session存储随机token...
1. 在 Web 应用程序中,防止用户重复提交表单,例如注册、登录、提交订单等操作。 2. 在移动应用程序中,防止用户重复提交请求,例如登录、注册、提交订单等操作。 解决方案的优化方向 1. 优化 token 的生成算法,...
### AJAX 防止按钮重复提交 在Web应用开发中,为了避免用户因网络延迟或误操作而导致的数据重复提交问题,通常会采取一定的措施来确保数据的一致性和完整性。本篇文章将详细探讨如何通过AJAX技术结合JavaScript来...
在Web开发中,防止用户刷新页面而导致重复提交数据是一个重要的问题。这通常涉及到表单提交、支付确认等关键操作,确保这些操作仅执行一次是非常必要的。本资源提供了一个解决方案,通过使用“Token”机制来避免这种...