JavaWeb防止表单重复提交的几种方式

JavaWeb防止表单重复提交的几种方式JavaWeb防止表单重复提交的几种方式

大家好,又见面了,我是你们的朋友全栈君。

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

  1. 网络延迟的情况下用户多次点击submit按钮导致表单重复提交
  2. 用户提交表单后,点击【刷新】按钮导致表单重复提交(点击浏览器的刷新按钮,就是把浏览器上次做的事情再做一次,因为这样也会导致表单重复提交)
  3. 用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交
    二、防止防止表单重复提交的方式
    1、利用JavaScript防止表单重复提交
    (1)、用JavaScript控制Form表单只能提交一次
    主要代码:
<form action="${pageContext.request.contextPath}/servlet/DoFormServlet" onsubmit="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)、将提交按钮设置为不可用

主要代码:

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

(3)、验证码
页面上添加验证码,不管验证输入正确与否,提交后均刷新验证码。

(4)、ajax提交加锁
采用ajax方式提交表单时,设置一个布尔变量(true/false),当然其他类型变量也可以。初始时为true可以提交,在前端向服务器发出请求后,服务端响应结果没有回来之前将该值置为false,正常响应时再置为true。

(5)、提交后重定向到一个提交成功的页面
表单提交后跳转到另外一个成功页面。这样可以避免用户按F5导致的重复提交,浏览器也不会出现表单重复提交的警告,以及消除按浏览器前进和后退按导致的同样问题。

(6)、服务端生成一个唯一的token
首先在服务端生成一个token保证唯一性,然后将这个token保存在session或者redis等缓存中。与此同时将token放到页面的隐藏input中,发给浏览器。用户在页面上提交时带着这个token一块提交到服务端,服务端通过比对token的值。如果相等代表首次提交,此时将session或者缓存中保存的token值remove掉,反之则认为重复提交,服务端不予处理。

(7)、cookie记录表单提交的状态
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交过表单。跟上一种类似,服务端生成token存入Cookie,表单提交时将Cookie中token和服务端token比对。

(8)、数据库添加唯一索引约束
向数据库字段添加一个唯一索引。如果表单重复提交,那么数据库插入重复记录时,唯一约束能有效避免重复入库。这样控制的话,日志会出现Your program attempts to store duplicate values in a database column that is constrained by a unique index的报错信息,看着有点不爽。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106610.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue上传文件组件使用_uniapp支持ios文件上传

    vue上传文件组件使用_uniapp支持ios文件上传imgList:[],size:0,limit:undefined}},methods:{//设置fileClick(){document.getElementById(‘upload_file’).click()},fileChange(el){if(!el.target.files[0].size)returnthis.fileList(el.target)el.target.value=‘’},fileList(fileList){letfil

    2022年8月15日
    2
  • java io流面试_java面试核心知识点

    java io流面试_java面试核心知识点好久不见的IO流对IO流的学习,我记得还是初学Java基础的时候,后来找工作过程中经常看到有些招聘信息中写到熟悉IO流,现在想想IO流,真的是一脸懵逼,不说这么多废话了,IO流这次好好整理一下。说说IO流的类别在说流的类别之前,先说说什么是流,流其实就是对输入输出设备的抽象,可以把输入输出流理解为是一个通道,输入输出是相对程序而言的,如果是输出流,也就是往文件中写文件,而输入流,则是从文件中读取文件。从三个方面对IO流进行总结,一、字节流(一般都是xxxStream),二、字符流(xxxRead、xx

    2022年10月20日
    2
  • 克莱姆法则应用_克莱姆和克拉默法则

    克莱姆法则应用_克莱姆和克拉默法则克莱姆法则(由线性方程组的系数确定方程组解的表达式)是线性代数中一个关于求解线性方程组的定理,它适用于变量和方程数目相等的线性方程组。概念含有n个未知数的线性方程组称为n元线性方程组。1)当其右端的常数项b1,b2,…,bn不全为零时,称为非齐次线性方程组:其中,A是线性方程组的系数矩阵,X是由未知数组成的列向量,β是由常数项组成的列向量。非齐次线性方程组的矩阵形式:2)当常数项全为零…

    2022年9月12日
    3
  • springboot整合tkmybatis以及使用

    springboot整合tkmybatis以及使用经常用 mybatis 的的都知道 使用 mybatisorm 框架存在一个非常不友善的问题就是 就是每操作一个单表就需要自己手写一个 xml 文件 虽然说可以用工具生成 xml 和实体类可以解决这个问题 但是二次开发的时候对某个表字段进行修改的时候 生成 xml 文件就不现实啦 最近发现 tkmybatis 就非常好的解决了这个问题 在这里和大家分享一下 框架配置这里需要引用到的包 mybat

    2025年6月15日
    1
  • c酒店管理系统代码_酒店管理系统

    c酒店管理系统代码_酒店管理系统主要功能:1.添加员工信息2.显示员工信息3.删除员工信息4.修改员工信息5.查找员工信息6.员工信息排序7.清空数据(1)显示数据(2)修改数据(3)查找数据(4)信息排序部分代码展示:workerManager.cpp。需要完整代码可以留邮箱,有时间就发#include”stdafx.h”#include”work…

    2022年9月24日
    1
  • 移动端分享插件使用总结

    移动端分享插件使用总结

    2021年10月28日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号