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

Spring Boot表单提交GET正常POST报404问题求助

问题分析与解决方案

POST请求出现404但GET正常,核心原因大概率是Spring Security的CSRF防护拦截了POST请求,以下是具体分析和解决办法:

1. 核心原因:CSRF令牌缺失

Spring Security默认启用CSRF(跨站请求伪造)防护机制,会对POST、PUT、DELETE等修改类请求强制验证CSRF令牌。你的表单提交POST请求时没有携带CSRF令牌,导致请求被Spring Security拦截,最终返回404(部分场景下可能返回403,取决于配置)。而GET请求不在CSRF防护的默认拦截范围内,因此可以正常访问控制器。

2. 解决办法

方法一:在表单中添加CSRF令牌

通过Spring提供的EL表达式手动添加隐藏字段,或者使用Spring表单标签自动生成令牌:

手动添加隐藏字段

<form action="http://localhost:8080/form/submit" method="post">
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
    <button type="submit">Submit</button>
</form>

使用Spring表单标签(推荐)

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form action="/form/submit" method="post">
    <button type="submit">Submit</button>
</form:form>

方法二:临时关闭CSRF防护(不推荐生产环境)

如果是测试场景,可以在Spring Security配置中关闭CSRF防护:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/form/**").authenticated()
            .and()
        .csrf().disable(); // 关闭CSRF防护
}

3. 额外检查点

  • 确认控制器的@RequestMapping路径和HTTP方法完全匹配:你的GET请求正常,说明路径没问题,但可以再确认RequestMethod.POST是否正确配置。
  • 检查请求的Content-Type与控制器produces属性是否匹配:表单POST默认的Content-Type是application/x-www-form-urlencoded,而控制器设置的produces = MediaType.APPLICATION_XHTML_XML_VALUE,这不会导致404,但可能影响返回内容的渲染,若有需要可以调整produces或添加consumes属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:55:17