You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Thymeleaf删除按钮发送GET/POST请求而非DELETE请求?

问题原因

  1. a标签方案错误:HTML原生<a>标签仅支持发送GET请求,天然无法匹配你定义的@DeleteMapping接口,因此返回405方法不允许错误。
  2. 表单方案未生效原因:Spring Boot 2.2+版本默认禁用了HiddenHttpMethodFilter,该过滤器负责读取表单提交的_method参数,将原生POST请求转换为你指定的DELETE、PUT等请求方法。过滤器未开启的情况下,请求会被当作原生POST处理,自然无法匹配@DeleteMapping接口。

解决方案

第一步:开启请求方法转换过滤器

在项目的配置文件中添加如下配置:
如果使用application.properties:

spring.mvc.hiddenmethod.filter.enabled=true

如果使用application.yml:

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

第二步:调整删除按钮写法

抛弃a标签方案,使用简化后的Thymeleaf表单写法即可,th:method="delete"会自动生成_method隐藏域,无需手动添加:

<form th:action="@{/users/delete/{id}(id=${user.id})}" th:method="delete" >
    <button type="submit" class="btn btn-danger btn-sm">删除</button>
</form>

第三步:适配Spring Security配置

由于你引入了Spring Security依赖,默认会校验POST、DELETE等修改类请求的CSRF令牌,你需要在表单中添加CSRF令牌隐藏域,避免被Spring Security拦截:

<form th:action="@{/users/delete/{id}(id=${user.id})}" th:method="delete" >
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
    <button type="submit" class="btn btn-danger btn-sm">删除</button>
</form>

如果你的站点是纯内部管理系统,也可以在Spring Security配置中关闭CSRF校验,该操作存在安全风险,不推荐生产环境使用。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:27:01