后端如何防止表单重复提交

后端如何防止表单重复提交

问:Springboot 使用AOP实现防止接口重复提交
  1. 答:在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端。页面提交请求携带这个提交令牌,后端验证并在第一次验证后删除该令牌,保证提交请求的唯一性。
    思路没有问题,但是需要前后端都稍加改动,如果在业务开发完再加这个的话,改动量未免有些大了。无需前端配合,纯后端处理,是最清爽的。设计思路如下:
    自定义注解@RreventReSubmit标记所有Controller中的提交请求。通过AOP 对所有标记@RreventReSubmit的方法拦截。在业务方法执行前,获取当前用户的 token(或者JSessionId)+ 当前请求地址,作为一个唯一 KEY,去获取 Redis 分布式锁(如果此时并发获取,只有一个线程会成功获取锁)。当有请求调用接口时,到redis中查找相应的key,如果能找到,则说明重复提交,如果找不到,则执行操作。业务方法执行后,释放锁。
    切面类需要使用@Aspect和@Component这两个注解做标注。
    在想要防止重复提交的接口上添加注解即可使用。
问:spring mvc 如何防止表单重复提交
  1. 答:防止表单重复提交的两种方式
    1)通过重定向
    采取请求转发的方式完成表单内容的添加会造成内容的重复插入。
    当向Servlet发送一条增加记录的请求后,servlet首先向数据库增加一条记录,然后又从数据库中查询出所有数据,接着转发到另一个页面,这时,页面上浏览器的地址显示的是servlet的地址,当用户刷新页面时,又会向servlet发送一条添加请求,这样会导致数据库中重复数据不断增加。
    解决办法:采用重定向的方式添加数据不会导致数据的重复插入或删除。
    向servlet发送一个添加请求时,这个servlet只执行添加操作,然后重定向到另一个servlet进行数据的查询,最后转发到显示页面。
    2)通过Session Token(Session令牌)
    当客户端第一次向服务器端发送请求的时候,服务器会通过Token标签,并且会将这个字符串放到session中,然后将这个字符串发送给客户端,在提交之前页面上就有了一个字符串,服务器端也有一个字符串,两个字符串的内容是一样的,当你提交的时候,服务器会比较两个字符串是不是一样的,如果是一样的,就是第一次提交,并且更新服务器端的字符串;如果此时再次重复提交,服务器端的字符串已经发生改变而页面中的那个字符串还没有变,这时,你提交的时候两个字符串就不匹配了,服务器端就会认为是第二次提交,这样,服务器就不会再让提交了,进而转向invalid.token那<result>所指向的页面。
    其实就是第二次与第一次jsp页面向服务器提交的内容和第一次一模一样,当在浏览器上返回前一页时,表单中提交的内容和第一次也是易语言的,所以这种情况下提交也会失败,当返回前面一夜然后刷新,刷新相当于向服务器发送了一次请求,所以这样提交就可以成功。
  2. 答:防止表单重复提交的两种方式
    1)通过重定向
    采取请求转发的方式完成表单内容的添加会造成内容的重复插入。
    当向Servlet发送一条增加记录的请求后,servlet首先向数据库增加一条记录,然后又从数据库中查询出所有数据,接着转发到另一个页面,这时,页面上浏览器的地址显示的是servlet的地址,当用户刷新页面时,又会向servlet发送一条添加请求,这样会导致数据库中重复数据不断增加。
    解决办法:采用重定向的方式添加数据不会导致数据的重复插入或删除。
    向servlet发送一个添加请求时,这个servlet只执行添加操作,然后重定向到另一个servlet进行数据的查询,最后转发到显示页面。
    2)通过Session Token(Session令牌)
    当客户端第一次向服务器端发送请求的时候,服务器会通过Token标签,并且会将这个字符串放到session中,然后将这个字符串发送给客户端,在提交之前页面上就有了一个字符串,服务器端也有一个字符串,两个字符串的内容是一样的,当你提交的时候,服务器会比较两个字符串是不是一样的,如果是一样的,就是第一次提交,并且更新服务器端的字符串;如果此时再次重复提交,服务器端的字符串已经发生改变而页面中的那个字符串还没有变,这时,你提交的时候两个字符串就不匹配了,服务器端就会认为是第二次提交,这样,服务器就不会再让提交了,进而转向invalid.token那<result>所指向的页面。
    其实就是第二次与第一次jsp页面向服务器提交的内容和第一次一模一样,当在浏览器上返回前一页时,表单中提交的内容和第一次也是易语言的,所以这种情况下提交也会失败,当返回前面一夜然后刷新,刷新相当于向服务器发送了一次请求,所以这样提交就可以成功。
问:使用HttpModule来禁用Web表单重复提交
  1. 答:在网速慢或者网站反应慢的情况下 如果提交表单需要超过 秒的时间还未提交成功 多数人会重新点击提交 这样不仅造成错误的数据 还会加剧服务器的压力
    通过使用 我们可以在表单处理前 检测一些标志 从而防止用户重复提交数据 再通过一些接口 让用户自己来处理重复提交时 应该如何告诉用户
    通过使用 管不了)
    这种方法使用简单 直接把脚本和图片放在指定的目录中 然后在nfig中添加Module
       <Modules>    <! 防止重复提交 LOG记录MODULE >    <add name= NonReduplicatePostModule type= tests NonReduplicatePostModule test />    </Modules>
    下面是实现代码
    lishixinzhi/Article//201311/13804
后端如何防止表单重复提交
下载Doc文档

猜你喜欢