为什么Thymeleaf删除按钮发送GET/POST请求而非DELETE请求?
问题原因
- a标签方案错误:HTML原生
<a>标签仅支持发送GET请求,天然无法匹配你定义的@DeleteMapping接口,因此返回405方法不允许错误。 - 表单方案未生效原因: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
相关产品推荐
相关产品推荐

