bigfork/silverstripe-form-idempotency

支持幂等键以帮助防止重复提交表单

安装: 230

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 3

分支: 0

开放问题: 0

类型:silverstripe-vendormodule

1.0.1 2023-09-27 08:25 UTC

This package is auto-updated.

Last update: 2024-08-27 10:26:54 UTC


README

幂等性是数学和计算机科学中某些操作的性质,即它们可以被多次应用而不会改变结果超出初始应用。 维基百科

此模块旨在帮助防止重复提交表单,尤其是当用户在短时间内重复点击提交按钮时。对于标准HTML表单,这会导致浏览器“取消”之前的POST请求并提交新的请求,但是如果在服务器已经开始处理请求的情况下,这已经太晚来防止POST提交被多次处理。

请注意,这并不是垃圾邮件保护的替代品,事实上,这是专门为没有垃圾邮件保护的表单设计的,因为许多垃圾邮件保护程序已经确保表单只能提交一次。

概述

  • 当一个表单被渲染时,会生成一个唯一的“幂等键”并存储在隐藏字段中
  • 在提交时,服务器将检查用户的会话以查看此键是否已经被提交
  • 如果之前没有看到过此键(即第一次提交),则通常调用表单处理程序
  • 然后序列化表单操作的结果并将其存储在会话中
  • 如果再次使用相同的幂等键提交表单,则跳过表单处理程序,并返回会话中的序列化结果

安装

composer require bigfork/silverstripe-form-idempotency

使用

在构建表单时调用 $form->enableIdempotency()

局限性

  • 表单处理程序返回的结果(你的“public function doSomething()”)存储在会话中,因此它必须是可序列化的。一个典型的响应(例如一个重定向 HTTPResponse,或一个可序列化的 HTMLText 实例,如渲染的模板)已经是可序列化的,但如果你正在执行任何高度定制的操作,你可能需要检查。
  • 如果你的表单处理程序进行重定向,那么在(1)客户端收到重定向响应并浏览器向目标发出GET请求之间,以及(2)客户端从目标收到GET请求的响应之间,存在一个很小的窗口。如果用户在这个窗口内再次点击提交,会话消息(如表单或“闪”消息)可能会丢失,因为GET请求将导致它们被渲染和清除。这种情况很少见,上面描述的缓存响应仍将返回,但如果你依赖于一次性的会话消息作为反馈,那么它们可能不会始终出现。