DeleteMapping删除学生报405错误,改用GET是否为不良实践?
问题解答
为什么@DeleteMapping报错405,@GetMapping却可行?
浏览器里的<a>标签点击后默认发送GET请求,而你Controller里的@DeleteMapping("/delete/{id}")只接收HTTP DELETE方法的请求,请求方法不匹配,所以抛出405(Method Not Allowed)错误。
换成@GetMapping时,Controller接收GET请求,和<a>标签的请求方法完全匹配,所以逻辑能正常执行。
用GET请求替代DELETE是不是不良实践?
是,这属于不符合HTTP规范的不良实践:
- HTTP方法有明确语义:GET用于读取/获取资源,要求是安全(不修改服务器状态)且幂等的;DELETE用于删除资源,是修改服务器状态的操作。用GET做删除完全违背了这种语义约定。
- 存在实际风险:搜索引擎爬虫、浏览器预加载、用户误触刷新等情况,都可能意外触发删除操作,导致数据丢失。
怎么正确实现删除操作?
推荐两种符合规范的方案:
方案1:用表单模拟DELETE请求
Spring支持通过_method参数将POST请求转换为DELETE请求(Spring Boot默认已启用HiddenHttpMethodFilter)。把<a>标签换成表单:
<form th:action="@{'/students/delete/' + ${student.id}}" method="post" style="display: inline-block;"> <input type="hidden" name="_method" value="delete"> <button type="submit" class="btn btn-danger">Delete</button> </form>
点击按钮时会发送POST请求,Spring会自动转换为DELETE请求,匹配你的@DeleteMapping方法,执行删除后跳转到/students页面。
方案2:用AJAX发送DELETE请求
如果后续需要避免页面刷新,可以用JavaScript发送DELETE请求,完成后再跳转:
// 给删除按钮绑定点击事件 document.querySelectorAll('.delete-btn').forEach(btn => { btn.addEventListener('click', function(e) { e.preventDefault(); // 阻止默认GET跳转 const deleteUrl = this.getAttribute('href'); fetch(deleteUrl, { method: 'DELETE' }).then(() => { window.location.href = '/students'; // 删除成功后跳转 }); }); });
对应的HTML标签保留,添加class:
<a th:href="@{'/students/delete/' + ${student.id}}" class="btn btn-danger delete-btn">Delete</a>
内容的提问来源于stack exchange,提问作者Tomás Iglesias
相关产品推荐
相关产品推荐

