使用Spring Integration 4.0.3.RELEASE,我在文档中看到支持DefaultHttpHeaderMapper实例的自定义,但我发现这样做有一些意想不到的结果。
我创建了一个DefaultHttpHeaderMapper实例,除了标准前缀之外,它还允许使用我们的专有头标题。
例如(回复):
private static final String[] RESPONSE_HEADER_NAME_PATTERNS = {DefaultHttpHeaderMapper.HTTP_RESPONSE_HEADER_NAME_PATTERN, MY_HTTP_PREFIX_PATT};
...
mapper.setOutboundHeaderNames(RESPONSE_HEADER_NAME_PATTERNS);
我对请求方做了类似的事情。
还有一些方法可以在实例上设置排除项:
public void setExcludedOutboundStandardRequestHeaderNames(String[] excludedOutboundStandardRequestHeaderNames);
public void setExcludedInboundStandardResponseHeaderNames(String[] excludedInboundStandardResponseHeaderNames)
似乎唯一可以在类中处理排除项的地方是shouldMapOutboundHeader(String headerName)
方法。 但是,如果已完成自定义,则不会执行排除路径。
第419行:if (this.outboundHeaderNames == HTTP_RESPONSE_HEADER_NAMES)
第431行:else if (this.outboundHeaderNames == HTTP_REQUEST_HEADER_NAMES)
即使我还包括标准标头集,但这些条件并不正确,因为我还添加了自己的标头模式。效果是我需要排除的一些标准标题(例如,Content-Length
用于响应,默认情况下通过HTTP_RESPONSE_HEADER_NAMES_INBOUND_EXCLUSIONS
字段设置)不会被排除。
我觉得可以设置标题并设置排除项似乎很奇怪但是如果你不使用其中一种静态工厂方法来创建一个完全不变的实例,你就不会得到那些排除了排除。
我可以想到几种方法,但是因为这看起来像一个简单的用例(只是添加我自己的标题模式),我被引导相信我没有使用正确的结构。
如果我对如何误解本课程的使用或其他方式的建议有所了解,我们将不胜感激。
用例是关于保留标准标头(例如http)的正确默认管理,即使还需要专有标头。
我的用例似乎非常标准(认识到我可能有偏见):服务器和客户端通过http网关来回传递消息。消息本身可以有3种类型的标题:
当我从Spring Integration 2.1.0.RELEASE =>升级时出现问题。 4.0.3.RELEASE。
升级后,Content-Length
标头未正确处理,因此服务器响应的有效负载被截断(请求负载较小)。
一些研究表明:
2.1.0.RELEASE的DefaultHeaderMapper没有排除逻辑,表明此内容长度情况正在其他地方处理,因此我的自定义实例没有任何不良影响。 在4.0.3.RELEASE中,似乎Content-Length头的正常运行依赖于DefaultHeaderMapper中现在存在的排除逻辑。因为我没有调用因为我添加了标题模式,所以http通信不起作用(响应被破坏)。
答案 0 :(得分:0)
这是对的。仅当outboundHeaderNames
等于HTTP_RESPONSE_HEADER_NAMES
(或HTTP_REQUEST_HEADER_NAMES
)数组时,排除才有效。
您必须更具体,并提供您将要实现的信息。
如果只想排除更多现有标准标头(HTTP_RESPONSE_HEADER_NAMES
或HTTP_REQUEST_HEADER_NAMES
),您真的应该使用setExcludedOutboundStandard*HeaderNames
方法。
如果您想添加更多标题,但又不想使用默认的X-
用户前缀,则可以将其更改为``(空字符串)。
如果您想在此后过滤某些标题,呃,必须覆盖fromHeaders
方法。
我同意,如果您对改进有一些想法并在JIRA中与我们分享,那么它就没那么有用,会很棒。
感谢您指出这一点!