`
fhqibjg
  • 浏览: 53841 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

防ajax重复提交

    博客分类:
  • js
阅读更多

    经常在工作中测试人员发现一些重复提交的问题,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 防止按钮重复提交

    防止用户误操作,重复提交

    element-ui如何防止重复提交的方法步骤

    先说对话框(Dialog)里的表单提交 错误方案 说起错误方案,比如,点击提交按钮,本地验证,验证通过立即让按钮不可点,这些没问题,而我的错误点概括是:在某个最后执行的回调函数的最后一行,我做了2个操作:1,...

    JS Ajax请求如何防止重复提交

    主要介绍了JS Ajax请求如何防止重复提交的相关资料,通过覆盖掉$.ajax而达到防止重复提交的问题,实现代码简单,需要的朋友可以参考下

    图片点击放大缩小遮罩层以及 ajax加载中防止重复提交加载遮罩层

    一,缩略图片点击放大有遮罩层,按原画尺寸放大,在次点击任意位置缩小的demo。 二,ajax 用于上传文件 或提交数据时防止重复加载的遮罩层js代码

    jquery-showloading遮罩层-防重复提交

    一款简单易用的jquery插件showLoading,可以有效防止页面重复提交问题,注意,使用的时候如果涉及到ajax,要将asyc设为true,否则不生效

    AJAX避免用户重复提交请求实现方案

    在使用AJAX(jQuery)异步请求数据时,为了避免因某些原因用户同时多次点击按钮,提交重复的请求,我们需要禁用请求提交按钮。 重点:jQuery的 attr 和 removeAttr 两个函数,主要是元素button的disabled属性。 Demo:...

    前端防止用户重复提交js实现代码示例

    背景 前端在向后端进行数据提交的时候,通常会需要在第一次提交返回前,阻止用户在快速点击发送二次请求,即防止重复...异步防重复提交的方案如下 通过 jQuery 提供的 ajaxPrefilter 方法,将在请求提交之前进行过

    JSP防止网页刷新重复提交数据的几种方法

    主要介绍了JSP防止网页刷新重复提交数据的几种方法,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    maven+spring boot前后台分离项目

    完整的maven前后台分离项目,框架结构spring boot,前台用html+ajax,结合有echarts折线图,写有可读取配置文件修改部署端口号的功能。

    如何在WebForm中使用javascript防止连打(双击)

    http://www.cnblogs.com/dahuzizyd/archive/2007/01/04/javascript_Double_click.html在WebForm上,有的处理需要比较长的时间,为了防止重复提交,就要使用防连击 javaScript代码: function doubleCheck(){ if ...

    oqss在线表单引擎2.5版

    防IP重复提交,可设置重复提交时间间隔 可设定问卷结束日期 可设定提交后的显示页,可设置为问卷评分结果,可设置提交后显示问卷报表 问卷密码前置,可设置问卷密码,打开问卷前需要输入密码,保护你的问卷 即时...

    OQSS 在线问卷调查系统 v5.0.rar

    防IP重复提交,可设置重复提交时间间隔 可设定问卷结束**期 可设定提交后的显示页,可设置为问卷评分结果,可设置提交后显示问卷报表 问卷密码前置,可设置问卷密码,打开问卷前需要输入密码,保护你的问卷 即时...

    高颜值自适应博客主题Puock WordPress主题

    提示:为了防止主题不兼容,请在安装主题前进行数据备份,防止数据字段重复覆盖等情况发生。 主题特性: 支持白天与暗黑模式 全局无刷新加载 支持博客与CMS布局 内置WP优化策略 一键全站变灰 网页压缩成一行 ...

    自适应博客主题Puock WordPress主题高颜值

    提示:为了防止主题不兼容,请在安装主题前进行数据备份,防止数据字段重复覆盖等情况发生。 主题特性: 支持白天与暗黑模式 全局无刷新加载 支持博客与CMS布局 内置WP优化策略 一键全站变灰 网页压缩成一行 后台防...

    Wordress主题高颜值自适应博客Puock主题

    提示:为了防止主题不兼容,请在安装主题前进行数据备份,防止数据字段重复覆盖等情况发生。 主题特性: 支持白天与暗黑模式 全局无刷新加载 支持博客与CMS布局 内置WP优化策略 一键全站变灰 网页压缩成一行 后台防...

    JavaWeb外卖点餐系统典型模块开发

    本课程是对JavaWeb后台开发技术的综合应用案例,包括JSP、...涉及的开发讲解要点包括:商家界面查看菜单、购物车、订单模块、评论功能、支付功能、商家地图导航和送餐地址回放、注册登录、分页功能、防重复提交等。

    基于WordPress开发的高颜值的自适应Puock主题,支持白天与黑夜模式v2.8.2

    提示:为了防止主题不兼容,请在安装主题前进行数据备份,防止数据字段重复覆盖等情况发生。重要:请不要直接克隆或直接下载仓库进行使用,请到发行版中进行下载使用 环境要求 WordPress >=6.0 PHP >=7.4 主题特性...

    新坐标企业网站管理系统 v1.0.rar

    4、验证码和禁止重复提交数据防止广告注入。 5、ip地址和留言时间跟踪。 友情连接管理 1、友情连接分类设置可随意按分类在不同地方调用。 2、合并广告管理,在页面任意地方插入“[removed][removed]”即可将id为...

    php网络开发完全手册

    7.3.1 字符串重复操作——str_repeat 104 7.3.2 字符串替换操作——str_replace 7.3.2 和str_ireplace 104 7.3.3 字符串分解操作——str_split 106 7.3.4 字符串单词数的计算函数—— 7.3.4 str_word_count 107 ...

Global site tag (gtag.js) - Google Analytics