【问题标题】:Tomcat CORS Filter: Why is the default list of headers in "Access-Control-Allow-Headers" so arbitrarily limited?Tomcat CORS过滤器:为什么“Access-Control-Allow-Headers”中的默认标头列表如此任意限制?
【发布时间】:2026-01-14 04:20:02
【问题描述】:

Tomcat (7.0.50) 带来了一个实现 CORS 规范的特殊过滤器。在此过滤器中,允许的标头的默认列表如下:

Origin、Accept、X-Requested-With、Content-Type、Access-Control-Request-Method、Access-Control-Request-Headers。

我知道我可以使用过滤参数“cors.allowed.headers”替换该列表并指定我自己的标题列表。我知道。但我有以下问题:

  • 创建此过滤器时,为什么列表中充满了这个 -abritrarily- 短标题列表?为什么是这些标题而不是其他标题?例如,为什么列表中没有“缓存控制”标头?这份名单是如何选出的?
  • 如果我想定义一个更完整的列表,我应该包括哪些标题?有很多标题需要考虑!
  • 我可以使用“*”而不是指定列表吗?这是 CORS 规范允许的吗?
  • 我知道 CORS 规范定义了这种列表,但是……为什么有必要这样做?如果客户端请求的至少一个标头不在允许的标头列表中,为什么我们不能只接受飞行前 OPTIONS 步骤中的任何标头,而不是返回 403(禁止)?
  • 为什么过滤器中没有选项来执行以下操作: response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers") ?

我很困惑。我的 API 的一位用户在飞行前步骤中发送了“Access-Control-Request-Headers”列表中的“cache-control”标头,并收到了 HTTP 403 错误状态。我可以将此标头添加到列表中(使用“cors.allowed.headers”过滤器参数)。但是下次某个客户端发送另一个不在列表中的标头时呢?

布赖恩

【问题讨论】:

    标签: tomcat filter cors


    【解决方案1】:

    我花了几个小时试图理解 CORS 规范 (http://www.w3.org/TR/cors/)。真的很难理解。

    cors.allowed.headers 列表指定实际请求中允许哪些标头。

    在预检请求中,客户端通过“Access-Control-Request-Headers”字段告诉服务器,资源必须允许哪些标头。如果这些值之一不在 cors.allowed.headers 列表中,则请求被拒绝。此行为在 CORS 规范中指定。

    我认为 Access-Control-Request-Headers 用于检查请求的资源是否真的支持这些标头。如果不是,则无法满足实际请求。事实上,Tomcat 返回“FORBIDDEN”可能是一个实现细节。

    如果您需要上一点提到的一些特殊功能,您可能需要实现自己的 CORS 过滤器。

    【讨论】:

      最近更新 更多