经常在工作中测试人员发现一些重复提交的问题,js的ajax重复提交尤为常见(几乎全是)。虽然处理办法有多种,但一般都只是前台js做处理。且这种处理对于个要数据提交处都要做逻辑判断来去防止,如果有多处这种请求不仅工作量大且而且不利于统一管理。
介绍一种处理这种问题的一个办法,虽不是最好最简结的但算是比较好管理且减少工作量的。
1,首先js上做下规范,发送ajax请求可用同一包装方法。这样比较容易对js请求做统一处理,即使有改动也不必要去每处发送请求的地方去查找。
myAjaxs = {
/*
* 请求获取后台数据统一调用
* @param {object} param{
* type : '', get/post
* url : '', 请求URL
* dataType: '', json或其他
* data : {}, 参数
* succFun : function(){}, 成功回调函数
* errFun : function(){} 失败回调函数
* }
*/
ajax : function(param){
if(!param){
return;
}
var params = {
type : 'post',
dataType : 'json',
data : {'token' : token , 'date':new Date().getTime()}
};
$.extend(params,param);
var obj = {};
obj.url = params.url;
obj.type = params.type;
obj.dataType = params.dataType;
obj.data = params.data;
obj.complete = function(XMLHttpRequest, textStatus){
//这里请求完成后回调函数 (请求成功或失败时均调用),
//所以我们这里来做防止重复ajax提交当然也可放在成功能回调里去做 上面传参 'token' : token
//这里的token设为一个全部变量用于保存后台传过来的
//当后台有token传过来就覆新值否则不变
token = XMLHttpRequest.token || token;
}
if(param.succFun){
obj.success = function(json){
//你要处理的逻辑
param.succFun.apply(null,[params,resjson]);
};
}
if(params.errFun){
obj.error = function(request, textStatus, errorThrown){
//你要处理的逻辑
param.errFun.apply(null,[request,textStatus,errorThrown,params]);
};
}
return $.ajax(obj);
}
};
2,后台java处理,这里要使用到拦截器(工程中没用到struts的可以用过滤器去实现)。建一个方法拦截器类,这拦截器配制只拦截你所要拦截的方法(有ajax数据提交的方法),当然也可以自己去指定那些特定action用这个拦截器。在拦截器里面我们要做一个token处理,类似struts自带的token防页面重复提交。
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
// 生成一个随机码,用作防止重复提交
String newToken = String.valueOf(System.currentTimeMillis());
String requetToken = request.getParameter("token");
Object token = session.getAttribute("ajax_token");
String retStr;
if(token == null){
session.setAttribute("ajax_token", newToken);
retStr = print("{\"token\" :" + newToken },invocation);
}else if(requetToken.equals(token.toString())){
session.setAttribute("ajax_token", newToken);
retStr = print("{\"token\" :" + newToken ,invocation);
}else{
retStr = Action.SUCCESS;
}
return retStr;
}
private String print(String msg,ActionInvocation invocation) throws IOException{
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter out = response.getWriter();
out.print(msg);
out.flush();
out.close();
return invocation.invoke();
}
/*这种方法实现也存在着问题,如果可以提交后要反回一些json数据从action那里,而这种改变不了action json的值只能覆盖,所以也不通用。同时还存在着由于网络原因或是其它导致token从服务器端传不到js回调函数中的原因,导致请求都不能提交。大家可以根据自己项目中实现问题再去小小改动*/
分享到:
相关推荐
本篇文章将详细探讨如何通过AJAX技术结合JavaScript来实现按钮的防重复提交功能。 #### 一、问题背景与解决思路 当用户在表单中填写完信息后点击提交按钮,如果此时网络环境不稳定或用户在短时间内连续点击多次...
在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...
在使用Layui设计表单时,经常会遇到表单提交后页面刷新导致的重复提交问题。为了解决这个问题,开发者需要确保表单只提交一次,防止不必要的数据重复处理或者服务器的重复计算。下面详细解释几种防止Layui表单重复...
在Spring MVC框架中,防重复提交是一个常见的需求,特别是在处理重要的业务操作时,如订单创建、用户注册等。重复提交可能会导致数据不一致,影响系统的稳定性。本篇将详细介绍如何在Spring MVC中自定义实现防重复...
在实际应用中,应根据项目需求和安全级别选择合适的防重复提交策略,并结合服务器端的控制,以达到最佳效果。同时,良好的用户体验也很重要,比如提供明确的提交反馈和操作提示,避免让用户感到困惑。
在IT行业中,尤其是在前端开发领域,防止用户重复提交是一项重要的任务,这有助于避免因网络延迟或用户误操作导致的数据混乱。Element-UI,一个流行的Vue.js组件库,提供了多种方式来处理这个问题。以下是如何在使用...
- 使用异步处理:使用Ajax提交表单,可以避免页面整体刷新,减少重复提交的机会。 - 提供明确的用户反馈:当表单成功提交后,显示清晰的反馈信息,告知用户操作已完成,防止他们因不清楚状态而多次尝试。 综上所...
文档提供了一个防止Ajax重复提交的示例方法,通过修改原生的$.ajax方法来实现。具体方法是使用一个闭包封装原有的$.ajax方法,并在封装函数中实现去重逻辑。这个封装函数被命名为kinhomAjax。 5. 封装函数实现细节...
在J2EE应用程序开发中,重复提交是一个常见的问题,它可能导致数据不一致性和其他系统问题。当用户在短时间内连续点击提交按钮或者由于网络延迟导致请求重复发送时,服务器可能会接收到多个相同的操作请求,这就需要...
其次,"ajax加载中防止重复提交的遮罩层js代码"涉及到Ajax请求的管理。在用户进行文件上传或数据提交时,防止用户意外地多次点击提交按钮是非常重要的,因为这可能导致后台处理多个相同请求,带来不必要的资源浪费或...
"jquery-showloading遮罩层-防重复提交"是一款基于jQuery的插件,它旨在解决用户可能误点击导致的重复提交问题,并提供良好的加载反馈,提升用户体验。这款插件通过创建一个遮罩层来阻止用户在数据处理期间进行额外...
- 使用Ajax进行异步提交,可以更精确地控制请求的生命周期,如在请求开始时显示加载指示器,请求成功后更新界面,请求失败时给出错误提示,且不会刷新整个页面,减少了重复提交的可能性。 9. **过滤器(Filter)**...
在Java服务器页面(JSP)中,防止重复提交是一个重要的考虑因素,因为它可能导致数据不一致性和其他业务逻辑问题。重复提交通常发生在用户由于网络延迟或误操作而多次点击提交按钮时。以下是一些关于如何在JSP中实现...
在使用AJAX(jQuery)异步请求数据时,为了避免因某些原因用户同时多次点击按钮,提交重复的请求,我们需要禁用请求提交按钮。 重点:jQuery的 attr 和 removeAttr 两个函数,主要是元素button的disabled属性。 Demo:...
- 使用Ajax进行异步提交,可以减少页面刷新,降低重复提交的概率。 - 设置Token的有效时间,避免用户长时间未操作后重复提交。 - 结合前端JavaScript进行预防,如禁用提交按钮或显示加载状态,避免用户频繁点击。...
在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或处理逻辑的混乱。Struts2提供了多种方法来防止这种情况,其中一种是通过重定向来实现。下面将详细解释Struts2如何通过重定向来防止表单重复提交。 ...
在网页开发中,防止用户重复提交是一个常见的需求,特别是在处理重要的数据交互时,如订单创建、用户注册等。重复提交可能会导致数据冗余或者逻辑错误,因此需要采取措施来避免这种情况。这里,我们通过分析标题、...
1. **生成Token**: 当用户访问一个需要防重复提交的表单时,服务器会生成一个唯一的Token并将其存储在服务器端(比如Session)和客户端(通常隐藏在表单中)。 2. **提交表单**: 用户填写表单并点击提交按钮,这个...
总结,Ajax异步无重复注册技术通过实时验证和前端防重复提交机制,实现了高效且用户体验良好的注册流程。同时,结合后端验证和安全措施,确保了注册过程的稳定性和安全性。开发者在实际应用中,应根据项目需求和用户...
3. **前端限制**:利用JavaScript控制表单的提交行为,例如禁用提交按钮或使用AJAX异步提交等方式减少重复提交的可能性。 #### 四、总结 本文详细探讨了“回调或回传参数无效”及“表单重复提交”这两种不常见的...