Spring MVC 中的重复表单检测和处理

问题描述 投票:0回答:1

我发现很难确定检测重复表单提交的最佳实践。 我正在使用最新的 SpringBoot、Thymeleaf 和 Spring-Security,并且开箱即用的 CSRF 功能似乎都可以正常工作。

应用程序的设计是这样的,提交按钮通过 JavaScript onclick 被禁用,成功的 POST 导致重定向(POST->重定向->获取模式),我(似乎错误地)认为 CSRF 保护将提供服务器 -对 JavaScript 漏掉的任何内容进行侧面保护。

出于某种原因,我的狡猾的 Logitech G500 鼠标(已开始双击所有内容)设法突出显示了应用程序的问题。 不知何故,它击败了 JavaScript,并且表明服务器上没有针对重复表单提交的保护 - 即表单被处理了两次。 稍后我将研究 JavaScript,但我不想依靠它来保护服务器,因此我希望能够在服务器上检测到它。

考虑到 Spring 的作用(包括 CSRF 保护),我有些惊讶,并且进行了大量的谷歌搜索。 据我所知,旧的 Spring 框架中曾经有一些东西(引用 AbstractFormController.handleInvalidSubmit),但现在不再存在。 我还看到了对RequestMappingHandlerAdapter 和synchronizeSession 和sessionForm 等设置的引用,但我还不太理解它们。 人们还制作了大量自定义解决方案,包括具有关联标签库的 HandlerInterceptorAdapter 和执行某些自定义处理的缓存。

所以我的问题是:

  1. 为什么 CSRF 保护不能防止这种情况发生?
  2. 内置了什么样的支持来检测和处理重复的表单提交?
  3. 如果需要定制解决方案,您对最佳实践有什么建议吗? 特别是,第二次点击将被拒绝 如果我显示错误页面,用户可能永远不会看到处理 第一次点击,因此没有意识到它实际上已被处理 直接。

我读过这篇文章:Spring 中的重复表单提交,包括 2009 年的同步器部分,但当然它已经很旧了,其中一些内容不再有效。

谢谢

马库斯

forms spring-mvc spring-security csrf-protection
1个回答
0
投票

您可以利用 struts 中的令牌处理器并将其复制到您的代码库中。

然后向所有控制器扩展的 BaseController 添加一些方法: 保存令牌 重置令牌 令牌是否有效

你可以在struts中找到这个。

您仍然需要为其创建的令牌提供一个隐藏字段,以将其放入您的表单中。 这只是一个包含令牌的隐藏字段。

如果您有更多问题,请询问

© www.soinside.com 2019 - 2024. All rights reserved.