Angular5与Spring Boot场景下大请求体Post请求无法抵达服务器并报CORS错误
这类“小POST请求正常、大POST请求触发CORS无允许响应头”的报错,根本不是跨域配置失效导致的,也不需要调整Angular 5侧的HTTP请求配置:当请求体超过服务端/前置代理的大小阈值时,请求会在到达业务接口、甚至到达CORS响应处理逻辑之前就被前置层拦截,拦截后返回的错误响应没有附带Access-Control-Allow-Origin头,浏览器就会将前置层的拦截误判为CORS策略报错。
内嵌容器默认请求体大小限制
Spring Boot默认内嵌的Tomcat,对POST请求体的大小限制为2MB,超过阈值的请求会在Tomcat的Connector层直接抛出RequestRejectedException,这个阶段的响应由Tomcat原生生成,完全不会触发Spring MVC层的CORS配置,自然不存在跨域允许头。
对应调整配置,在项目配置文件中添加:# 调整Tomcat允许的POST请求体上限 server.tomcat.max-http-form-post-size=20MB server.tomcat.max-swallow-size=20MB # 调整Spring Multipart解析的请求体上限,适用于包含文件上传的POST场景 spring.servlet.multipart.max-file-size=20MB spring.servlet.multipart.max-request-size=20MB如果项目替换了内嵌容器为Jetty/Undertow,按照同层级配置调整对应容器的
maxHttpPostSize参数即可。前置反向代理/API网关的大小限制
如果后端服务之前挂载了Nginx、云厂商API网关、企业内部网关这类反向代理组件,这类组件的默认POST请求体上限通常为1-2MB,超过阈值的请求会被代理层直接返回413状态码,响应内容不会透传后端的CORS配置头,进而触发浏览器的CORS报错。
对应调整需在代理组件的对应路由配置中,放开对应接口的请求体大小上限,以Nginx为例的配置片段:# 在对应server/location配置块中添加 client_max_body_size 20m;自定义CORS过滤器的执行顺序错误
如果项目是手动实现的CORS过滤器而非使用Spring官方提供的CORS配置,需要确认过滤器的优先级是所有Web过滤器中最高的。如果CORS过滤器的执行顺序在请求体解析、参数校验、权限校验的过滤器之后,当大请求触发前置校验异常时,响应流程会直接被异常拦截打断,不会经过CORS过滤器补充跨域响应头。
对应修复:给自定义CORS过滤器类添加最高优先级注解,确保其最先处理请求:@Order(Ordered.HIGHEST_PRECEDENCE) public class CustomCorsFilter implements Filter { // 原有CORS逻辑保持不变 }
绕过前端页面,直接用Postman/API测试工具向目标后端接口发送与前端同逻辑、同大小的POST请求:
- 如果返回413 Payload Too Large、或者无任何跨域头的错误响应,即可确认是上述前置层的请求大小拦截问题
- 如果小请求正常、大请求在直连后端时可以正常处理,再检查反向代理层的配置即可
内容的提问来源于stack exchange,提问作者Abhishek

