2015-02-08 68 views
1

Tomcat(7.0.50)带来了一个实现CORS规范的特殊过滤器。在此过滤器中,允许标头的默认列表如下:Tomcat CORS过滤器:为什么“Access-Control-Allow-Headers”中的默认头文件列表受到任意限制?

原始,接受,X请求,内容类型,访问控制请求方法,访问控制请求头。

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

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

我很困惑我的API的一个用户在飞行前的步骤中在“访问控制请求头”列表中发送了“缓存控制”头,并且收到了一个HTTP 403错误状态,我可以将此标题添加到列表中(使用“cors.allowed.headers”过滤器参数)。但下一次某些客户端发送另一个不在列表中的标题时如何?

Brian

回答

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过滤器。

相关问题