精华内容
下载资源
问答
  • 开发过程,遇到post重复提交问题,导致数据写入混乱。然后采用了一种方式: (框架:TP) 在请求之前,加上表单隐藏域:__hash__不过体验度很差 在后端, //防止表单重复提交 if(!check_token($_POST)){ $...

    开发过程,遇到post重复提交问题,导致数据写入混乱。然后采用了一种方式:

    (框架:TP)

    在请求之前,加上表单隐藏域:__hash__不过体验度很差

    在后端,

    		//防止表单重复提交
    	    if(!check_token($_POST)){
    	        $this->ajaxReturn(null,"请不要重复提交",0);
    	    }

    ,这样也算解决了重复提交的问题,不过遇到同时打开多个浏览器时,hash是不同的,还是可以进行重复提交,想了想,试着用memcache锁机制写了一段简短代码,临时解决了这样的问题:

    	/**
    	 * @uses 采用memcache控制重复提交
    	 * @author jhl
    	 */
    	public function _AuthenticateRealNameMemcacheControl($user_id){
    	    
    	    $keyname = 'AuthenticateRealNamePostControl_'.$user_id;
    	    $lockkeyname = $keyname.'_lock';
    	    $CacheMemcache=new CacheMemcache();
    	    $lockkeyvalue = $CacheMemcache->get($lockkeyname);
    	    if($lockkeyvalue == 'lock'){
    	        $CacheMemcache->set($lockkeyname,'unlock',1);
    	        $this->ajaxReturn(null,"请不要重复提交",0);
    	    }elseif($lockkeyvalue == 'unlock'){
    	         $CacheMemcache->set($lockkeyname,'lock',1);
    	    }else{
    	        $CacheMemcache->set($lockkeyname,'lock',1);
    	    }
    	}


    在进入方法引入:

    		    //防止多个页面同时提交
    	    $this->_AuthenticateRealNameMemcacheControl(C('userId'));

    虽然通过了测试人员的测试,不过细想下,其实还是很难满足要求的,暂且这样吧,睡觉






    展开全文
  • 高并发下重复提交问题的处理

    千次阅读 2017-01-11 16:34:31
  • 1. 为什么会出现表单重复提交问题? 网络延迟的情况下用户多次点击submit按钮导致表单重复提交 用户提交表单后,点击【刷新】按钮导致表单重复提交(点击浏览器的刷新按钮,就是把浏览器上次做的事情再做一次,因为...

    1. 为什么会出现表单重复提交问题?

    1. 网络延迟的情况下用户多次点击submit按钮导致表单重复提交
    2. 用户提交表单后,点击【刷新】按钮导致表单重复提交(点击浏览器的刷新按钮,就是把浏览器上次做的事情再做一次,因为这样也会导致表单重复提交
    3. 用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交

    2.解决方案

    2.1 前端解决方案(治标不治本)

    2.1.1用JavaScript控制Form表单只能提交一次

    主要代码:

    <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" οnsubmit="return dosubmit()" method="post">
        用户名:<input type="text" name="username">
        <input type="submit" value="提交" id="submit">
    </form>
    
    <head>
        <title>Form表单</title>
        <script type="text/javascript">
            var isCommitted = false;//表单是否已经提交标识,默认为false
            function dosubmit(){
                if(isCommitted==false){
                    isCommitted = true;//提交表单后,将表单是否已经提交标识设置为true
                    return true;//返回true让表单正常提交
                } else {
                    return false;//返回false那么表单将不提交
                }
            }
        </script>
    </head>
    
    

    2.1.2提交以后将提交按钮设置为不可用(体验可能不太好)

    主要代码:

    function dosubmit(){
        //获取表单提交按钮
        var btnSubmit = document.getElementById("submit");
        //将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮
        btnSubmit.disabled= "disabled";
        //返回true让表单可以正常提交
        return true;
    }
    
    

    2.1.3提交以后将页面关闭(可能用户体验不好)

    2.1.4提交以后将页面数据刷新 这个时候将本条记录的主键id拿到,后端进行插入的时候看看主键id是否存在决定进行插入或者修改

    2.2 后端解决方案

    2.2.1利用Session防止表单重复提交

    主要步骤:

    1. 在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),并在当前用户的Session域中保存这个Token

    token生成类

    public class TokenProccessor {
     
        /*
         *单例设计模式(保证类的对象在内存中只有一个)
         *1、把类的构造函数私有
         *2、自己创建一个类的对象
         *3、对外提供一个公共的方法,返回类的对象
         */
        private TokenProccessor(){
        }
        
        private static final TokenProccessor instance = new TokenProccessor();
        
        /**
         * 返回类的对象
         * @return
         */
        public static TokenProccessor getInstance(){
            return instance;
        }
        
        /**
         * 生成Token
         * Token:Nv6RRuGEVvmGjB+jimI/gw==
         * @return
         */
        public String makeToken(){
            String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
            //数据指纹   128位长   16个字节  md5
            try {
                MessageDigest md = MessageDigest.getInstance("md5");
                byte md5[] =  md.digest(token.getBytes());
                //base64编码--任意二进制编码明文字符   adfsdfsdfsf
                BASE64Encoder encoder = new BASE64Encoder();
                return encoder.encode(md5);
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    
    
    String token = TokenProccessor.getInstance().makeToken();//创建令牌
    System.out.println("在FormServlet中生成的token:"+token);
    request.getSession().setAttribute("token", token);  //在服务器使用session保存token(令牌)
    request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp页面    
    
    1. 将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端
    <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" method="post">
        <%--使用隐藏域存储生成的token--%>
        <%--
            <input type="hidden" name="token" value="<%=session.getAttribute("token") %>">
        --%>
        <%--使用EL表达式取出存储在session中的token--%>
        <input type="hidden" name="token" value="${token}"/> 
        用户名:<input type="text" name="username"> 
        <input type="submit" value="提交">
    </form>
    
    1. 在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
    /**
     * 判断客户端提交上来的令牌和服务器端生成的令牌是否一致
     * @param request
     * @return 
     *         true 用户重复提交了表单 
     *         false 用户没有重复提交表单
     */
    private boolean isRepeatSubmit(HttpServletRequest request) {
        String client_token = request.getParameter("token");
        //1、如果用户提交的表单数据中没有token,则用户是重复提交了表单
        if(client_token==null){
            return true;
        }
        //取出存储在Session中的token
        String server_token = (String) request.getSession().getAttribute("token");
        //2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单
        if(server_token==null){
            return true;
        }
        //3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单
        if(!client_token.equals(server_token)){
            return true;
        }
        
        return false;
    }
    

    doGet方法中:

    
    boolean b = isRepeatSubmit(request);//判断用户是否是重复提交
    if(b==true){
        System.out.println("请不要重复提交");
        return;
    }
    request.getSession().removeAttribute("token");//移除session中的token
    System.out.println("处理用户提交请求!!");
    

    对于【场景二】和【场景三】导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了。使用token的方法能解决【场景二】和【场景三】的情况。

    2.3 前端加后端的解决方案

    思路: 前端提交以后,页面弄一个加载动画,后端处理完成以后将本条数据的主键id返回前端,前端第二次请求的时候把主键id附上值即可。

    总结:

    常见的方法有四种:

    • 方法一:禁用掉“提交(注册)”按钮,当用户第一次点击提交注册按钮时,事务已经提交了,但是网络存在不稳定性,可能没有及时作出响应,这时用户可能会认为没有点击提交按钮,进而会再次点击提交按钮,
      这是不符合我们的业务逻辑的,因此,我们可以在用户第一次点击提交按钮之后,立刻将提交按钮设置为不可用状态(例如:变灰),用户就不会再次提交了。

    • 方法二:采用页面重定向,在用户点击提交按钮之后,转向一个新的页面,提示用户提交成功。

    • 方法三:采用标志,在一个会话中,当用户请求一个表单时,服务器端在发送页面的时候可以生成一串密文(也可以是随机数),跟随页面同时发给客户端,当客户端填写好表单后,点击提交按钮,再次将这个密文发回到服务器端,并和服务器端的密文进行比对,如果相同,则开始处理业务,如果不相同,则不处理此次业务(像互联网金融行业大多采用这种方式)。

    • 方法四:利用服务器端的数据库,可以在数据库的表里添加相关的约束来防止重复提交,但是这样会增加数据库的负载。

    上面的四种方法各有利弊,我们可以根据项目的实际情况来选择,也可以将这些方法组合起来使用。

    参考链接;https://www.jianshu.com/p/5fd07359ad22
    https://www.cnblogs.com/guozhenqiang/p/5439455.html

    展开全文
  • coursera 机器学习 作业提交问题及解决方法 使用matlab R2019b提交作业出现问题 在提交ex时出现:函数或变量’parts’无法识别 解决方法 具体问题提示截图如下: 在coursera的讨论区中找到对应解决方法的链接,点击...

    使用matlab R2019b提交作业出现问题

    在提交ex1时出现:函数或变量’parts’无法识别

    解决方法

    具体问题提示截图如下:
    问题截图
    在coursera的讨论区中找到对应解决方法的链接,点击下图中machine-learning-ex.zip即可下载课程作业压缩包。
    (位于第二周的Environment Setup Instructions中的第二份阅读材料Access the MATLAB Online Trial and the Exercise Files)
    相应解决方法

    展开全文
  • navicat事务自动提交问题

    千次阅读 2020-04-07 16:40:36
    问题:编辑完数据之后点击“✔”提交的时候navicat卡了,然后提示“MySql Lock wait timeout exceeded”,截图现在没有了,总之意思就是超时了。 原因:后来查了好多资料,原来是navicat的自动提交事务关闭了,导致...
  • 解决表单重复提交问题

    千次阅读 多人点赞 2017-08-12 11:41:41
    问题背景:由于用户或网络延迟原因,用户在提交表单时会多次点击提交,此时表单内容会被多次提交给服务器。这样会资源的浪费。亟待解决。表单重复提交类型:1. 提交完表单以后,不做其他操作,直接刷新页面,表单会...
  • 本文着重介绍,通过java后端处理重复提交问题。开发环境是:spring boot 2.0+react+ant+dva,下图是主要流程思路:以下是详细步骤代码:1:客户端登陆,服务端登陆成功后返回初始的表单令牌package co...
  • Kaggle结果提交问题//用指令提交

    千次阅读 2019-08-06 19:25:35
    问题提交时一直提交不上,在这两个页面切换 估计是被墙了… 解决方案 1.挂个VPN 2.利用指令提交 打开cmd,输入 pip install kaggle 当然我根据提示,更新了pip.(注意cmd用管理员模式开) 然后再在C:\Users\...
  • Struts2 防止重复提交问题

    千次阅读 2012-07-02 00:53:56
    相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据, 那么如何防止重复提交问题, 下面我是思考和一些参考整理的结果, 先看看其原理: 防止重复提交原理:  首先,在页面访问的时候server端产生一...
  • layer关闭弹出窗口触发表单提交问题处理 问题:上面的代码在点关闭按钮后,会确发提交表单请求,会将表单的信息进行保存操作。但关闭按钮是不需求执行保存操作的。 原因:关闭按钮没有标识type属性,系统会默认其...
  • 客户端验证失败后表单仍然提交问题!导致页面刷新,辛辛苦苦输入的内容荡然无存。多么奇怪的问题。按道理,验证失败,就应该显示各种错误信息,不会提交表单才对。而现在,错误信息正常显示,但页面却刷新了一遍。更...
  • 常见表单重复提交问题和处理方法

    千次阅读 2013-11-13 10:31:35
    一、常见的重复提交问题:  a>点击提交按钮两次。  b>点击刷新按钮。  c>使用浏览器后退按钮重复之前的操作,导致重复提交表单。  d>使用浏览器历史记录重复提交表单。  e>浏览器重复的HTTP请求。 二、...
  • 表单重复提交问题

    千次阅读 2018-08-10 17:01:23
    在网站中有很多地方都存在表单重复提交问题,如用户在网速慢的情况下可能会重复提交表单,又如恶意用户通过程序来发送恶意请求等,这时都需要设计一个防止表单重复提交的机制。 要防止表单重复提交,就要标识用户...
  • webuploader 手动提交问题

    千次阅读 2016-04-18 16:03:23
    当用用手动提交方式上传文件时,会报错 abort 异常信息,原因是 手动提交,会将页面的form表单提交。而webuploader自身也构建了form表单,从而导致文件上传中断。
  • 弱网环境测试与重复提交问题总结

    千次阅读 2015-06-04 00:13:23
    弱网环境测试与重复提交问题总结 我们的做的那款App有个签到功能,该功能的基本逻辑是:用户当天签到时会先去数据库查询一下是否已经签到过,如果没有则插入数据作为当天的签到记录。有段时间经常发现会有重复签到...
  • java后端解决重复提交问题

    万次阅读 2017-10-02 18:10:15
    二、表单的重复提交会导致的问题? 主要能够造成很多脏数据。 三、解决的办法: 3.1 前端解决办法:通过前端的方法将提交按钮变灰。对于前端的办法这里就不做演示了,因为前端的控制虽然能够防止数据的重复...
  • form表单重复提交问题

    千次阅读 2016-10-12 16:34:24
    昨天晚上下班时候在微信上看到一篇表单重复提交的文章,本地自己实践了一下,今天跟大家分享一下。
  • 关于Coursera上的斯坦福机器学习课程的编程作业提交问题 Submission failed: unexpected error: urlread: Peer certificate cannot be authenticated with given CA certificates.
  • Form表单input回车提交问题

    千次阅读 2018-08-27 16:29:29
    问题出在form上,当表单中只有一个文本框的时候获取焦点并点击回车之后会提交表单内容,就会发生刷新事件。 发现问题所在就好解决问题了。 现在有三种解决方案: 1.全局禁用回车事件 function document....
  • form表单action提交问题详解

    万次阅读 2018-06-17 03:48:37
    https://yq.aliyun.com/ziliao/64915form 提交action中参数无效页面通过表单(form)想服务器提交数据的时候有两种形式...form的action属性就是提交数据的url地址,method属性可以指定是GET或POST。需要注意的是如果...
  • 有关如何防止表单重新提交问题

    千次阅读 2017-08-29 10:44:15
    一、会造成表单重新提交的情况: 在用户使用我们应用的时候经常会出现在网络延迟的情况下让用户有时间点击多次提交按钮;表单提交后用户点击【刷新】按钮;用户提交表单后,点击浏览器的【后退】按钮回退到表单...
  • 我在微信浏览器使用确定"/>提交form表单时,有时候 会提交两次,第一次有数据,第二次没有数据,后台也拦截到两次请求,第二次因为没有数据就会报错。请问什么情况下会出现这种情况,怎么解决
  • IDEA Git提交问题,nothing to commit

    千次阅读 2020-02-27 19:44:27
    今天提交代码由于操作失误,提交失败了,但是当我再次提交的时候,显示nothing to commit 当遇到这种情况,手动提交就好了 点击项目->git->Repository->push 就可以了 ...
  • 表单重复提交问题解决方案

    千次阅读 2018-09-18 17:10:25
    2.网速较慢的情况,我们让表单中的提交按钮只能提交一次,然后就不能再次点击了 &lt;form action="FormServlet" method="post"&gt; &lt;input type="text" name="...
  • DWZ (JUI) 教程 单个NavTab 中 多个Form表单提交问题 新浪微博 http://weibo.com/u/1534913940 最近有朋友问到 一个 NavTab中 有多个form表单提交问题 问题如下 我正在使用DWZ框架, 我想请问一下 一个jsp...
  • 在页面中使用WebWork的token标签解决表单重复提交问题 王保政 我们的项目是基于Struts开发的,在设计时没有考虑重复提交的问题,所以用户在点击页面的提交,然后在下一个浏览器页面点后退,或者点提交时没跳转到新...
  • for循环中控制事务单个提交问题

    万次阅读 2018-12-18 11:52:29
    最近有个业务是for循环里面,循环一次业务提交一次,过程中发现事务不能提交,总结一下这个问题 第一点: 我用的是通用mapper,用到他的updateByPrimaryKeySelective方法,这个方法必须设置主键,不然他的where...
  • Machine Learning 课程作业提交问题 warmUpExercise作业通过Octave提交的时候会出现用户名不存在或者类似的错误,如下 "Exception: We could not verify your username / password" 在coursera对应的论坛中有很多...
  • * 自定义一个注解,给需要防止重复提交的方法加上该注解 */ public @interface RepeatSubmit { }复制代码使用spring的aop,对注解进行切面,通过guava的缓存来记录提交和设置过期时间@Aspect @Configuration ...
  • jquery-mobile表单提交问题

    万次阅读 2014-04-25 16:52:00
    关于使用jquery-mobile表单提交遇到的问题  当你使用了jquery-mobile的时候,如果你在前台提交一个了一个form表单,而在后台你处理完业务逻辑之后想要重定向到另一个方法或页面的时候。 切记要在form表单处添加一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,143,612
精华内容 457,444
关键字:

提交问题