【问题标题】:Spring Boot Form request trackingSpring Boot 表单请求跟踪
【发布时间】:2018-11-08 17:35:30
【问题描述】:

我正在开发一个 Spring Boot MVC 应用程序,并正在考虑如何实现 双重表单提交问题的解决方案。

我正在考虑的解决方案是生成一个唯一的 id 并在用户请求时将其附加到表单中。然后,当用户提交表单时,将收到的 id 与原始 id 进行比较,如果匹配,则发送。如果有更多请求进来,我可以看到这是重复提交并拒绝请求。

解决方案很简单,我希望我也能找到一个简单的实现。我有大约 8 种不同的 Thymeleaf 表单需要通过添加唯一 ID 来更新,我真的不想将 ID 添加到支持 Thymeleaf 表单的 POJO 中。有没有办法可以将唯一 ID 添加到将返回的 http 标头或类似的不需要更新 Java Pojos 的东西? 谢谢

【问题讨论】:

    标签: spring forms spring-boot thymeleaf


    【解决方案1】:

    您可以在表单中包含 CSRF 令牌,Spring 会自动处理它,但如果您尚未在项目中使用它,您可能需要包含 Spring Security。

    例如

    <form>
        ...
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
    </form>
    

    Official Spring documentation for CSRF with examples

    【讨论】:

    • 这种方法的唯一问题是 CSRF 令牌是基于会话的。这意味着用户在刷新会话之前将无法提交(在第一个表单之后)任何其他表单。我可以为每个请求生成一个新的 csrf,但我读过这会导致 Web 应用程序出现奇怪的行为(例如,新选项卡没有相同的标记等)
    • 好吧,如果你不想使用 CSRF 令牌,你可以随时使用Post/Redirect/Get pattern
    • 我已经实现了 Post/Redirect/Get 模式,但它只与表单提交后的页面相关。它不会在页面导航之前处理多次提交。我最终只是将令牌单独添加到表单中,因为我没有看到一个好的选择
    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多