java - DefaultHttpHeaderMapper 允许自定义,但不执行排除逻辑

标签 java http-headers spring-integration

使用 Spring Integration 4.0.3.RELEASE,我在文档中看到支持 DefaultHttpHeaderMapper 实例的自定义,但我发现这样做会产生一些意外的结果。

我创建了一个 DefaultHttpHeaderMapper 实例,除了标准的 header 前缀之外,它还允许使用我们专有的 header 前缀。

例如(响应):

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)

尽管我还包含了标准 header 集,但这些条件并不成立,因为我还添加了自己的 header 模式。其效果是一些我需要排除的标准 header (例如响应的 Content-Length ,默认情况下通过 HTTP_RESPONSE_HEADER_NAMES_INBOUND_EXCLUSIONS 字段设置)没有被排除。

对我来说,可以设置 header 和设置排除项似乎很奇怪,但如果您不使用静态工厂方法之一来创建完全未更改的实例,则您将无法删除这些排除项。

我可以想到一些解决这个问题的黑客方法,但由于这看起来是一个足够简单的用例(只需添加我自己的 header 模式),我相信我没有使用正确的构造。

如果我能澄清我如何误解此类的使用或对其他方式的建议,我们将不胜感激。

<小时/>

用例是关于保留标准 header (例如 http)的正确默认管理,即使还需要专有 header 。

我的用例看起来非常标准(认识到我可能有偏见):服务器和客户端通过 http 网关来回传递消息。消息本身可以有 3 种类型的 header :

  1. http 功能的标准 header
  2. 我用于特定服务器-客户端通信的专有 header (我的前缀)
  3. 可以在内部处理期间添加但应删除的 header 然后穿过电线到达另一边。

当我从 Spring Integration 2.1.0.RELEASE => 4.0.3.RELEASE 升级时,问题出现了。 升级后,Content-Length header 未得到正确处理,因此服务器响应的有效负载被截断(请求有效负载较小)。 一些研究表明:

2.1.0.RELEASE 的 DefaultHeaderMapper 没有排除逻辑,表明此 Content-Length 情况正在其他地方处理,因此我的自定义实例没有任何不良影响。 在 4.0.3.RELEASE 中,Content-Length header 的正常运行似乎依赖于 DefaultHeaderMapper 中现在存在的排除逻辑。由于我添加了 header 模式,因此不会调用此方法,因此 http 通信不起作用(响应被破坏)。

最佳答案

这是正确的。仅当 outboundHeaderNames 等于 HTTP_RESPONSE_HEADER_NAMES(或 HTTP_REQUEST_HEADER_NAMES)数组时,排除才有效。

您必须更加具体并提供您将要实现的目标的信息。

如果只想排除更多现有标准 header (HTTP_RESPONSE_HEADER_NAMESHTTP_REQUEST_HEADER_NAMES),您确实应该使用 setExcludedOutboundStandard*HeaderNames 方法。

如果您想添加更多 header ,但不想使用默认的 X- 用户前缀,您可以将其更改为 ``(空字符串)。

如果您想在此后过滤一些 header ,呃,必须重写 fromHeaders 方法。

我同意它不是那么有用,如果您有一些关于改进的想法并在 JIRA 中与我们分享,那就太好了.

感谢您指出这一点!

关于java - DefaultHttpHeaderMapper 允许自定义,但不执行排除逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25437177/

相关文章:

java - 如何在 Java 中使用 WSDL 文件的序列化器?

java - 如何自动将时间戳字段添加到标记提交日期的 Java 类

java - JLabel.setText ("__") 在 for 循环中不会打印多次

xml - 如何将身份验证 header 传递给node-soap

java - 建议使用 Spring Integration Java DSL 进行失败转换的正确方法是什么

singleton - Websphere 集群中的集群范围的单例

java - quartz 中的 thread.sleep 必须与我的日程安排时间相匹配吗?

javascript - 在 NodeJS 中下载文件

security - 我可以使用 CSP 将请求限制为 https : AND 'self' ?

java - 在 Spring Integration 中使用拦截器发送日志消息