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
相关产品推荐
相关产品推荐

