我发现很难确定检测重复表单提交的最佳实践。 我正在使用最新的 SpringBoot、Thymeleaf 和 Spring-Security,并且开箱即用的 CSRF 功能似乎都可以正常工作。
应用程序的设计是这样的,提交按钮通过 JavaScript onclick 被禁用,成功的 POST 导致重定向(POST->重定向->获取模式),我(似乎错误地)认为 CSRF 保护将提供服务器 -对 JavaScript 漏掉的任何内容进行侧面保护。
出于某种原因,我的狡猾的 Logitech G500 鼠标(已开始双击所有内容)设法突出显示了应用程序的问题。 不知何故,它击败了 JavaScript,并且表明服务器上没有针对重复表单提交的保护 - 即表单被处理了两次。 稍后我将研究 JavaScript,但我不想依靠它来保护服务器,因此我希望能够在服务器上检测到它。
考虑到 Spring 的作用(包括 CSRF 保护),我有些惊讶,并且进行了大量的谷歌搜索。 据我所知,旧的 Spring 框架中曾经有一些东西(引用 AbstractFormController.handleInvalidSubmit),但现在不再存在。 我还看到了对RequestMappingHandlerAdapter 和synchronizeSession 和sessionForm 等设置的引用,但我还不太理解它们。 人们还制作了大量自定义解决方案,包括具有关联标签库的 HandlerInterceptorAdapter 和执行某些自定义处理的缓存。
所以我的问题是:
我读过这篇文章:Spring 中的重复表单提交,包括 2009 年的同步器部分,但当然它已经很旧了,其中一些内容不再有效。
谢谢
马库斯
您可以利用 struts 中的令牌处理器并将其复制到您的代码库中。
然后向所有控制器扩展的 BaseController 添加一些方法: 保存令牌 重置令牌 令牌是否有效
你可以在struts中找到这个。
您仍然需要为其创建的令牌提供一个隐藏字段,以将其放入您的表单中。 这只是一个包含令牌的隐藏字段。
如果您有更多问题,请询问