精华内容
下载资源
问答
  • 表单重复提交

    2019-02-24 00:27:02
    在平时开发中,如果网速比较慢的情况下,或者远程有延迟,用户提交表单后,发现服务器半天都没有响应,那么用户... 表单重复提交的情况:  1.第一次单击提交之后,在没有提交成功情况下,又单击提交按钮。  ...

        在平时开发中,如果网速比较慢的情况下,或者远程有延迟,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,这样会出现表单的重复提交,造成向服务器发送两次请求,所以我们在开发中必须防止表单


    重复提交。

      表单重复提交的情况:

              1.第一次单击提交之后,在没有提交成功情况下,又单击提交按钮。

               2.提交完表单之后,刷新网页。

               3.用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交。

      解决方案:

             网上很多解决办法,一下连接解决方案比较全面,还有图文演示:https://www.cnblogs.com/xdp-gacl/p/3859416.html

    自己解决办法:利用session,在表单中做一个标记,提交到servlet时候,检查标记是否在且和预定义标志一直,若一直,则受理请求,并销毁标记,若不一致,或者没有标记,则直接响应消息,“表单重复提交”。

       步骤:

                  》在原表单页面,随机生成一个token

                 》在原表单页面,将token值放入到session属性当中

                 》token属性值也放在隐藏域当中

                 》在目标页面中,:获取session和隐藏域token值,比较两个值是否一致,若一致,受理请求,且把session与中的session属性清除。

    表单页面 :

    <%@page import="org.apache.catalina.Session"%>
    <%@page import="java.util.Date"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
       <%
              String token=new Date().getTime()+"";
              HttpSession  sessio= request.getSession(true);
              sessio.setAttribute("token", token); 
       %>
    
       <h1>Step-1:选择要购买的书籍</h1>
       <form action="<%=request.getContextPath() %>/procesStep1" method="post">
            <input type="hidden"  name="token"  value="<%=token%>">
            <table cellpadding="10" cellspacing="0" border="1px">
                <tr>
                 <td>书名</td>
                 <td>购买</td>
                </tr>
                <tr>
                 <td>Java</td>
                 <td><input type="checkbox" name="book" value="java"></td>
                </tr>
                <tr>
                 <td>C++</td>
                 <td><input type="checkbox" name="book" value="c++"></td>
                </tr>
                <tr>
                 <td>Python</td>
                 <td><input type="checkbox" name="book" value="python"></td>
                </tr>
                <tr>
                 <td>web</td>
                 <td><input type="checkbox" name="book" value="web"></td>
                </tr>
                <tr>
                <td  colspan="2"> <input type="submit" value="submit"></td>
                </tr>
            </table>
            
       </form>
    
    </body>
    </html>

            目标服务器:   

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    		//1550936037932
    		 String sessionToken = (String)request.getSession().getAttribute("token");
    		 String requestToken = request.getParameter("token");
    		 if(sessionToken!=null&&sessionToken.equals(requestToken)) {
    			 request.getSession().removeAttribute("token");
    		 }else {
    			 //request.getRequestDispatcher("/shoppingCart/relogin.jsp");
    			 response.sendRedirect(request.getContextPath()+"/shoppingCart/relogin.jsp");
    			 return ;
    		 }
    		 
    		//request.setCharacterEncoding("UTF-8");
    	    ServletContext servletContext = request.getServletContext();
    	    String servletContextName = servletContext.getServletContextName();
    	      ServletConfig servletConfig = getServletConfig();
    	     String[] parameterValues = request.getParameterValues("book");
    	     request.getSession().setAttribute("book", parameterValues);
    	     String contextPath = request.getContextPath();
    	     System.out.println(contextPath);
    	     //下面是绝对路径
    	     //   response.sendRedirect(contextPath+"/shoppingCart/step_2.jsp");
    	     //相对路径
    	     response.sendRedirect("shoppingCart/step_2.jsp");
    		
    	}

     

    展开全文
  • 表单重复提交什么意思?表单重复提交是重复多次的提交同一表单的意思。在平时开发中,如果网速比较慢的情况下,或者远程有延迟,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,...

    表单重复提交什么意思?

    表单重复提交是重复多次的提交同一表单的意思。

    在平时开发中,如果网速比较慢的情况下,或者远程有延迟,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,这样会出现表单的重复提交,造成向服务器发送两次请求,所以我们在开发中必须防止表单。

    表单重复提交的情况:

    1、第一次单击提交之后,在没有提交成功情况下,又单击提交按钮。

    2、提交完表单之后,刷新网页。

    3、用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交。

    表单重复提交问题的三种解决思路

    第一:如果是点击submit类型的按钮提交表单,就要先看是否是表单的默认提交事件,如果是,禁用默认提交事件(event.preventDefault();)或者改用button类型按钮提交$('#submit').click(function(e){

    e.preventDefault()

    })

    第二: 如果是点击按钮ajax提交,就要在提交之后禁用掉按钮,以免重复提交,这个在平时各种情况下的表单提交都考虑进去

    禁用按钮,加disabled属性,或者加pointer-event:none属性,或者用一个count来计数,只有在点击一次的时候才提交表单

    通常在提交成功之后会刷新或跳转页面,失败则不会,要注意一下,如果提交失败,把禁用的按钮解除禁用let count = 0;

    $('#submit').click(function(){

    count++;

    if (page.clicktime == 1) {

    setTimeout(()=>{

    $.ajax({

    success:res=>{

    if(!res.success){

    count = 0 // 提交按钮解除禁用

    }

    },

    error:err=>{

    count = 0 // 提交按钮解除禁用

    }

    })

    })

    }

    // $(this).attr('disabled,true) // 禁用按钮or

    // $(this).css('pointer-event','none') // 来禁用点击事件

    })

    第三: 如果是点击选项提交,那么就要考虑label和input的关联问题了,点击label, 事件冒泡,input也会触发一次提交

    可以这样来处理$('label').click(function(e) {

    if($(e.target).is('input')){ // 点击label的时候,如果事件源是input,那么就把它禁用掉

    return;

    }

    });

    最后,其他的点击事件也可以这样处理, 避免多次触发事件var isclick = true

    $('#id').click(function(){

    if(isclick){

    isclick = false; // 如果双击不想触发两次点击事件,可以在这里加一个禁用点击事件

    $(this).css('pointer-event','none')

    // do something

    setTimeout(()=>{ // 在这里过段时间再释放使得可以再次触发点击事件

    $(this).css('pointer-event','none')

    isclick = true

    })

    }

    })

    想要了解更多相关知识,请关注 html中文网!!

    展开全文
  • 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。一、表单重复提交...

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。

    一、表单重复提交的常见应用场景

    有如下的form.jsp页面

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1

    2

    3

    4

    5

    Form表单

    6

    7

    8

    9

    10 用户名:

    11

    12

    13

    14

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    form表单提交到DoFormServlet进行处理

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1 package xdp.gacl.session;

    2

    3 import java.io.IOException;

    4 import javax.servlet.ServletException;

    5 import javax.servlet.http.HttpServlet;

    6 import javax.servlet.http.HttpServletRequest;

    7 import javax.servlet.http.HttpServletResponse;

    8

    9 public class DoFormServlet extends HttpServlet {

    10

    11 public void doGet(HttpServletRequest request, HttpServletResponse response)

    12 throws ServletException, IOException {

    13 //客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码

    14 request.setCharacterEncoding("UTF-8");

    15 String userName = request.getParameter("username");

    16 try {

    17 //让当前的线程睡眠3秒钟,模拟网络延迟而导致表单重复提交的现象

    18 Thread.sleep(3*1000);

    19 } catch (InterruptedException e) {

    20 e.printStackTrace();

    21 }

    22 System.out.println("向数据库中插入数据:"+userName);

    23 }

    24

    25 public void doPost(HttpServletRequest request, HttpServletResponse response)

    26 throws ServletException, IOException {

    27 doGet(request, response);

    28 }

    29

    30 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    如果没有进行form表单重复提交处理,那么在网络延迟的情况下下面的操作将会导致form表单重复提交多次

    1.1、场景一:在网络延迟的情况下让用户有时间点击多次submit按钮导致表单重复提交

    演示动画如下所示:

    d05f07cffef47f6c187b5925a0c8a01d.png

    1.2、场景二:表单提交后用户点击【刷新】按钮导致表单重复提交

    演示动画如下所示:

    1d706802f97252c8f19e64c89b0fe83f.png

    点击浏览器的刷新按钮,就是把浏览器上次做的事情再做一次,因为这样也会导致表单重复提交。

    1.3、场景三:用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交

    演示动画如下所示:

    11eab7735fed70ae95dda80ba786e53e.png

    二、利用JavaScript防止表单重复提交

    既然存在上述所说的表单重复提交问题,那么我们就要想办法解决,比较常用的方法是采用JavaScript来防止表单重复提交,具体做法如下:

    修改form.jsp页面,添加如下的JavaScript代码来防止表单重复提交

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1

    2

    3

    4

    5

    Form表单

    6

    7 var isCommitted = false;//表单是否已经提交标识,默认为false

    8 function dosubmit(){

    9 if(isCommitted==false){

    10 isCommitted = true;//提交表单后,将表单是否已经提交标识设置为true

    11 return true;//返回true让表单正常提交

    12 }else{

    13 return false;//返回false那么表单将不提交

    14 }

    15 }

    16

    17

    18

    19

    20

    21 用户名:

    22

    23

    24

    25

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    我们看看使用了JavaScript来防止表单提交重复是否可以成功,运行效果如下:

    922635d2ed4156d95148fd28a7c310ee.png

    可以看到,针对"在网络延迟的情况下让用户有时间点击多次submit按钮导致表单重复提交"这个应用场景,使用JavaScript是可以解决这个问题的,解决的做法就是"用JavaScript控制Form表单只能提交一次"。

    除了用这种方式之外,经常见的另一种方式就是表单提交之后,将提交按钮设置为不可用,让用户没有机会点击第二次提交按钮,代码如下:

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1 function dosubmit(){

    2 //获取表单提交按钮

    3 var btnSubmit = document.getElementById("submit");

    4 //将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮

    5 btnSubmit.disabled= "disabled";

    6 //返回true让表单可以正常提交

    7 return true;

    8 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    运行效果如下:

    5f5c191074200055470eaa30dace83f4.png

    另外还有一种做法就是提交表单后,将提交按钮隐藏起来,这种做法和将提交按钮设置为不可用是差不多的,个人觉得将提交按钮隐藏影响到页面布局的美观,并且可能会让用户误以为是bug(怎么我一点击按钮,按钮就不见了呢?用户可能会有这样的疑问),我个人在开发中用得比较多的是表单提交后,将提交按钮设置为不可用,反正使用JavaScript防止表单重复提交的做法都是差不多的,目的都是让表单只能提交一次,这样就可以做到表单不重复提交了。

    使用JavaScript防止表单重复提交的做法只对上述提交到导致表单重复提交的三种场景中的【场景一】有效,而对于【场景二】和【场景三】是没有用,依然无法解决表单重复提交问题。

    三、利用Session防止表单重复提交

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

    具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。

    在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

    存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。

    当前用户的Session中不存在Token(令牌)。

    用户提交的表单数据中没有Token(令牌)。

    看具体的范例:

    1.创建FormServlet,用于生成Token(令牌)和跳转到form.jsp页面

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1 package xdp.gacl.session;

    2

    3 import java.io.IOException;

    4 import javax.servlet.ServletException;

    5 import javax.servlet.http.HttpServlet;

    6 import javax.servlet.http.HttpServletRequest;

    7 import javax.servlet.http.HttpServletResponse;

    8

    9 public class FormServlet extends HttpServlet {

    10 private static final long serialVersionUID = -884689940866074733L;

    11

    12 public void doGet(HttpServletRequest request, HttpServletResponse response)

    13 throws ServletException, IOException {

    14

    15 String token = TokenProccessor.getInstance().makeToken();//创建令牌

    16 System.out.println("在FormServlet中生成的token:"+token);

    17 request.getSession().setAttribute("token", token); //在服务器使用session保存token(令牌)

    18 request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp页面

    19 }

    20

    21 public void doPost(HttpServletRequest request, HttpServletResponse response)

    22 throws ServletException, IOException {

    23 doGet(request, response);

    24 }

    25

    26 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    2.在form.jsp中使用隐藏域来存储Token(令牌)

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1

    2

    3

    4

    5

    form表单

    6

    7

    8

    9

    10

    11

    12 ">

    13 --%>

    14

    15

    16 用户名:

    17

    18

    19

    20

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    3.DoFormServlet处理表单提交

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1 package xdp.gacl.session;

    2

    3 import java.io.IOException;

    4 import javax.servlet.ServletException;

    5 import javax.servlet.http.HttpServlet;

    6 import javax.servlet.http.HttpServletRequest;

    7 import javax.servlet.http.HttpServletResponse;

    8

    9 public class DoFormServlet extends HttpServlet {

    10

    11 public void doGet(HttpServletRequest request, HttpServletResponse response)

    12 throws ServletException, IOException {

    13

    14 boolean b = isRepeatSubmit(request);//判断用户是否是重复提交

    15 if(b==true){

    16 System.out.println("请不要重复提交");

    17 return;

    18 }

    19 request.getSession().removeAttribute("token");//移除session中的token

    20 System.out.println("处理用户提交请求!!");

    21 }

    22

    23 /**

    24 * 判断客户端提交上来的令牌和服务器端生成的令牌是否一致

    25 * @param request

    26 * @return

    27 * true 用户重复提交了表单

    28 * false 用户没有重复提交表单

    29 */

    30 private boolean isRepeatSubmit(HttpServletRequest request) {

    31 String client_token = request.getParameter("token");

    32 //1、如果用户提交的表单数据中没有token,则用户是重复提交了表单

    33 if(client_token==null){

    34 return true;

    35 }

    36 //取出存储在Session中的token

    37 String server_token = (String) request.getSession().getAttribute("token");

    38 //2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单

    39 if(server_token==null){

    40 return true;

    41 }

    42 //3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单

    43 if(!client_token.equals(server_token)){

    44 return true;

    45 }

    46

    47 return false;

    48 }

    49

    50 public void doPost(HttpServletRequest request, HttpServletResponse response)

    51 throws ServletException, IOException {

    52 doGet(request, response);

    53 }

    54

    55 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    生成Token的工具类TokenProccessor

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1 package xdp.gacl.session;

    2

    3 import java.security.MessageDigest;

    4 import java.security.NoSuchAlgorithmException;

    5 import java.util.Random;

    6 import sun.misc.BASE64Encoder;

    7

    8 public class TokenProccessor {

    9

    10 /*

    11 *单例设计模式(保证类的对象在内存中只有一个)

    12 *1、把类的构造函数私有

    13 *2、自己创建一个类的对象

    14 *3、对外提供一个公共的方法,返回类的对象

    15 */

    16 private TokenProccessor(){}

    17

    18 private static final TokenProccessor instance = new TokenProccessor();

    19

    20 /**

    21 * 返回类的对象

    22 * @return

    23 */

    24 public static TokenProccessor getInstance(){

    25 return instance;

    26 }

    27

    28 /**

    29 * 生成Token

    30 * Token:Nv6RRuGEVvmGjB+jimI/gw==

    31 * @return

    32 */

    33 public String makeToken(){ //checkException

    34 // 7346734837483 834u938493493849384 43434384

    35 String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";

    36 //数据指纹 128位长 16个字节 md5

    37 try {

    38 MessageDigest md = MessageDigest.getInstance("md5");

    39 byte md5[] = md.digest(token.getBytes());

    40 //base64编码--任意二进制编码明文字符 adfsdfsdfsf

    41 BASE64Encoder encoder = new BASE64Encoder();

    42 return encoder.encode(md5);

    43 } catch (NoSuchAlgorithmException e) {

    44 throw new RuntimeException(e);

    45 }

    46 }

    47 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    首先访问FormServlet,在FormServlet中生成Token之后再重定向到form.jsp页面,这次是在服务器端处理表单重复提交的,运行效果如下:

    2363c354787bf77fd0349c60ff9bf81f.png

    从运行效果中可以看到,通过这种方式处理表单重复提交,可以解决上述的场景二和场景三中出现的表单重复提交问题。

    展开全文
  • 在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,而是请求重定向返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改...

    在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,而是请求重定向返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改两次。

    导致表单重复提交的原因:

    第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失。在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,因而会产生重复提交的效果。

    解决方法:

    解决方法一:用重定向的方式 √

    解决方法二:用JS的方式 —— 提交表单后提交按钮变灰/隐藏提交按钮

    function check(){

    document.getElementById("submit").disabled=true;

    return true;

    }

    解决方法三:用令牌的方式

    ①在Servlet中,toStart重定向逻辑中,产生token,可以使用java.util包下的UUID.randomUUID( ),或者MD5加密生成,或者Base64Util加密,都可以!

    ②将生成的token字符串,放入session中。

    ③在withdraw.jsp 等页面表单中,设置一个input标签,并设置type=“hidden”,作为一个隐藏域,value=${token}

    ④回到对应表单提交的 Servlet 逻辑判断语句中,获取session中的token,和表单隐藏域中的getParameter的token,对这2个token的值进行判断。如果 !=null且相等,则执行相应业务操作

    ⑤token验证成功,且业务完成后,删除session中token

    PS:在这过程中,session只能用一次

    示例代码如下:

    前端jsp页面:

    pageEncoding="UTF-8"%>

    query

    function check(){

    document.getElementById("submit").disabled=true;

    return true;

    }

    您好,您当前卡余额为元

    取款金额:

    后端Servlet:

    import java.io.IOException;

    import java.util.Random;

    import java.util.UUID;

    import javax.servlet.ServletException;

    import javax.servlet.annotation.WebServlet;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import javax.servlet.http.HttpSession;

    import com.dayuan.util.MD5Util;

    /**

    * Servlet implementation class QueryPriceServlet

    */

    @WebServlet("/QukuanServlet")

    public class QukuanServlet extends HttpServlet {

    /**

    *

    */

    private static final long serialVersionUID = -4086427793187085793L;

    /**

    * @see HttpServlet#HttpServlet()

    */

    public QukuanServlet() {

    super();

    // TODO Auto-generated constructor stub

    }

    /**

    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

    * response)

    */

    protected void doGet(HttpServletRequest request,

    HttpServletResponse response) throws ServletException, IOException {

    String method = request.getParameter("method");

    String price = request.getParameter("price");

    HttpSession session = request.getSession();

    if (method == null || method.equals("")) {

    request.getRequestDispatcher("WEB-INF/jsp/main.jsp").forward(

    request, response);

    } else if (method.equals("toStart")) {

    // 创建令牌

    String token = UUID.randomUUID().toString();

    session.setAttribute("token", token);

    request.getRequestDispatcher("WEB-INF/jsp/qukuan.jsp").forward(

    request, response);

    } else if (method.equals("qukuan")) {

    String token1 = request.getParameter("token");

    String token2 = String.valueOf(session.getAttribute("token"));

    if (!(token1 != null && token1.equals(token2))) {

    session.setAttribute("msg", "取款失败,请求不合法");

    // 取款失败跳转到信息提示页面

    request.getRequestDispatcher("WEB-INF/jsp/msg.jsp")

    .forward(request, response);

    return;

    }

    // 取款逻辑

    System.out.println("取款操作。。。扣款:" + price + "元");

    session.setAttribute("msg", "取款成功!");

    session.removeAttribute("token");

    // 取款成功跳转到取款页面

    request.getRequestDispatcher("QukuanServlet?method=toStart")

    .forward(request, response);

    // response.sendRedirect("QukuanServlet?method=toStart");

    }

    }

    /**

    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

    * response)

    */

    protected void doPost(HttpServletRequest request,

    HttpServletResponse response) throws ServletException, IOException {

    doGet(request, response);

    }

    }

    展开全文
  • 防止表单重复提交,或者是防止按F5 刷新提交表单。在WEB开发中是经常会碰到这样的问题的。目前主流的解决方法有以下三种:1、采用脚本来解决2、重定向到别的页面3、使用s:token 标签由于我是使用S2SH来开发的,所以...
  • 转载自:http://blog.csdn.net/ye1992/article/details/42873219在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天...一、表单重复提交的常见应用场景有如下的form.jsp页面1 2 3 4 5 Form表单6...
  • 客户端防表单重复提交和服务器端session防表单重复提交.
  • 表单重复提交原理图1、Servelt的表单重复提交的一种解决方案session存验证码比如在登录时,可以通过验证码存在session中来解决login.jsp用户名:密码:验证码:ValidateCodeServlet@WebServlet("/ValidateCodeServlet")...
  • 由于网速等原因造成页面卡顿...这些情况都会导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机。因此有效防止表单重复提交有一定的必要性。2.解决方案2.1 通过JavaScript屏蔽提交按钮(不推...
  • Spring Boot + Token 实现接口幂等性 | 防止表单重复提交 一、概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能多次创建订单 支付接口, 重复支付...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,448
精华内容 2,579
关键字:

表单重复提交