Java REST服务POST请求返回403 Forbidden错误排查求助
解决Java REST服务POST请求403 Forbidden(GET正常)的问题
这种情况我太熟悉了——GET请求能正常走,POST却返回403,核心原因就是你的CorsFilter配置不完整,只放开了允许的源,但没处理**预检请求(OPTIONS)**和POST方法的权限,也没配置必要的请求头。
完整的CorsFilter配置(补充缺失的参数)
把你的web.xml里的CorsFilter配置替换成下面的完整版本:
<filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,PUT,DELETE,OPTIONS</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,Authorization,X-Requested-With,Accept,Origin</param-value> </init-param> <init-param> <param-name>cors.support.credentials</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>cors.preflight.maxage</param-name> <param-value>3600</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
关键参数解释
cors.allowed.methods:必须明确包含OPTIONS和POST——浏览器在发送非简单POST请求(比如带application/json类型的请求体)之前,会先发送OPTIONS预检请求,确认服务器允许该操作,如果没配置OPTIONS,直接就会返回403。cors.allowed.headers:列出前端可能用到的请求头,比如Content-Type(POST请求带JSON体时必须),确保预检请求能通过。cors.preflight.maxage:设置预检请求的缓存时间,避免浏览器频繁发送OPTIONS请求,提升性能。
额外排查点
如果配置完还是403,那要检查:
- 有没有其他安全拦截器?比如如果用了Spring Security,默认会开启CSRF防护,POST请求需要携带CSRF令牌,否则会被拦截。这种情况要么关闭CSRF(仅在非生产环境或无会话场景),要么配置前端携带令牌。
- 确认POST请求的
Content-Type是否在cors.allowed.headers里,比如如果用了multipart/form-data,要把这个头也加进去。
内容的提问来源于stack exchange,提问作者Salahudin Malik
相关产品推荐
相关产品推荐

