jQuery $.ajax POST请求触发CORS错误,Java服务器配置待完善
解决CORS请求中
cache-control头被拦截的问题 你遇到的错误已经把原因说得很明白了——浏览器的预检请求返回的Access-Control-Allow-Headers里没包含你发送的cache-control头,所以直接被CORS策略拦住了。
问题根源
你的Java CORS过滤器只配置了允许的请求源和请求方法,但没声明允许哪些自定义请求头。当你的POST请求带了cache-control这种非简单请求头时,浏览器会自动发送一个OPTIONS预检请求,询问服务器“这些头我能发吗?”,结果服务器没明确允许cache-control,浏览器就直接把请求拦截下来了。
修复方案
修改你的CORS过滤器代码,补上Access-Control-Allow-Headers配置,把你用到的Content-Type和cache-control都加进去:
@Override public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException { /* Enabling CORS filters */ MultivaluedMap<String, Object> headers = containerResponseContext.getHeaders(); headers.add("Access-Control-Allow-Origin", "*"); headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); // 新增这一行,明确允许请求中携带的头信息 headers.add("Access-Control-Allow-Headers", "Content-Type, cache-control"); }
额外说明
- 要是以后需要添加其他自定义请求头,直接在
Access-Control-Allow-Headers里用逗号追加即可。 - OPTIONS预检请求是浏览器自动触发的,你不需要手动处理,但服务器必须正确响应这些头信息才能通过检查。
- 为什么Postman能成功?因为Postman不会像浏览器那样严格执行CORS策略,它跳过了预检请求的检查环节,所以能直接拿到响应。
内容的提问来源于stack exchange,提问作者Manna
相关产品推荐
相关产品推荐

