Spring 4.0.6表单提交出现400 Bad Request错误求助
Spring 4.0.6表单提交400 Bad Request问题排查与解决
我来帮你梳理下这个问题的常见排查方向,毕竟Spring 4.0.6的表单提交400错误大多是参数绑定或者配置上的小问题,咱们一步步来定位:
1. 先抓核心:400错误的本质
在Spring MVC场景下,400 Bad Request绝大多数是请求参数无法正确绑定到后端的实体类/参数,或者是请求本身不符合Spring的安全规则导致的。优先去看你的服务器日志(比如Tomcat的localhost.log或者项目的日志文件),Spring通常会把具体的绑定错误打印出来,比如“无法将字符串转换为Integer类型”或者“缺少必填参数”,这能直接帮你定位到具体字段。
2. 排查表单字段与后端的映射匹配度
- 确保JSP表单里的
name属性值和后端Controller接收的实体类属性名完全一致(大小写敏感)。比如实体类有个userEmail属性,表单里写成useremail就会绑定失败。 - 检查字段类型是否匹配:比如后端实体类的
age是Integer类型,但表单里用户输入了字母,或者日期字段的格式和后端期望的不一致(比如后端期望yyyy-MM-dd,但表单输入了MM/dd/yyyy),都会导致类型转换失败触发400。 - 确认实体类的属性都有对应的
setter方法,Spring需要通过setter来注入参数值。
3. 检查Spring的CSRF防护配置
划重点!Spring 4.0开始默认启用了CSRF防护,所有POST请求必须携带CSRF token,否则会直接返回400。如果你的表单里没有添加CSRF相关的隐藏字段,这大概率是问题所在。你需要在表单里加上这段代码:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
把它放到<form>标签内部即可,Spring会自动填充对应的token值。
4. 验证请求方法和Content-Type
- 确保表单的
method是post,并且后端Controller对应的方法用@PostMapping(或者@RequestMapping(method = RequestMethod.POST))注解,方法不匹配也会导致错误。 - 如果表单包含文件上传(
enctype="multipart/form-data"),要确认后端配置了MultipartResolver。Spring 4里可以在XML配置里添加:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 10MB --> </bean>
或者用Java配置类声明这个bean,否则文件上传的POST请求会触发400。
5. 检查参数校验相关配置
如果你的实体类用了@NotNull、@NotEmpty等JSR-303校验注解,要确认Spring已经配置了校验器(比如Hibernate Validator)。如果没有配置但加了校验注解,也可能导致参数绑定失败返回400。可以在XML里添加:
<mvc:annotation-driven validator="validator"/> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> </bean>
结合你的JSP代码的快速检查
假设你的JSP表单代码类似这样:
<form action="/user/save" method="post"> <label>用户名:</label><input type="text" name="username"/><br/> <label>年龄:</label><input type="text" name="age"/><br/> <button type="submit">提交</button> </form>
你可以对应检查:
- 后端Controller的
save方法是否接收对应的实体类,且实体类有username(String)和age(Integer)属性及setter; - 表单里是否加了CSRF隐藏字段;
- 服务器日志里有没有明确的绑定错误提示。
按照这个思路排查,应该能很快找到问题所在。
内容的提问来源于stack exchange,提问作者Abhilash Shajan
相关产品推荐
相关产品推荐

