默认情况下,apachecamel将消息中存在的所有头转换为http头。这是非常有用的,但是由于许多组件也使用头作为内部状态,因此在外部http调用上可能会泄漏内部信息。例如,如果作业是使用计时器/cron启动的,那么我们最终会在线路上发送以下http头:
http-outgoing-1 >> fireTime: Mon Dec 28 10:14:00 CET 2020
http-outgoing-1 >> jobDetail: JobDetail 'Camel_camel-1.sync': jobClass: 'org.apache.camel.component.quartz.CamelJob concurrentExectionDisallowed: false persistJobDataAfterExecution: false isDurable: false requestsRecovers: false
http-outgoing-1 >> jobInstance: org.apache.camel.component.quartz.CamelJob@4ff90d52
http-outgoing-1 >> jobRunTime: -1
http-outgoing-1 >> mergedJobDataMap: org.quartz.JobDataMap@2338bfe0
http-outgoing-1 >> nextFireTime: Mon Dec 28 10:15:00 CET 2020
http-outgoing-1 >> refireCount: 0
http-outgoing-1 >> scheduledFireTime: Mon Dec 28 10:14:00 CET 2020
http-outgoing-1 >> scheduler: org.quartz.impl.StdScheduler@17a5f565
http-outgoing-1 >> trigger: Trigger 'Camel_camel-1.syncJob': triggerClass: 'org.quartz.impl.triggers.CronTriggerImpl calendar: 'null' misfireInstruction: 1 nextFireTime: Mon Dec 28 10:15:00 CET 2020
http-outgoing-1 >> triggerGroup: Camel_camel-1
http-outgoing-1 >> triggerName: syncJob
... (actual needed HTTP headers:)
http-outgoing-1 >> Connection: Keep-Alive
http-outgoing-1 >> User-Agent: Apache-HttpClient/4.5.12 (Java/11.0.6)
我知道我可以在尝试http调用之前删除所有头。因为我的其他路由也添加了我需要的内部头,所以在发送调用之前为我删除所有的“垃圾”头并不简单,而是保留我的内部头(最终也会出现在http调用btw中)。
我知道我可以为此使用属性。我知道我可以禁用消息头自动添加为http头。在这种情况下,我不确定是否需要手动添加http所需的头(如用户代理)。
另外,头文件的另一个常见误用是,如果您进行了两个http调用,但忘记清除头文件,则第一个调用的输出头文件将成为第一个调用的输入头文件。
有人找到一个很好的解决方法来避免这个问题吗?
1条答案
按热度按时间mm5n2pyu1#
这就是默认情况下基于http的端点(camel-http、camel-http4、camel-jetty、camel-restlet、camel-cxf、camel-cxfrs)处理头的方式(您可以使用headerfilterstrategy自定义此行为)。
使用者:使用
CamelHttp*
记录传入消息状态的头、原始消息中的所有http头和url选项(仅限jetty)。producer:将交换消息转换为目标消息格式
CamelHttp*
控制http生产者终结点行为的标头,Camel*
头被过滤掉,因为它们是供内部使用的,所有其他头都被转换为http头,除了content-length, content-type, cache-control, connection, date, pragma, trailer, transfer-encoding, upgrade, via, warning
.在发送调用之前为我删除所有的“垃圾”头并不是一件简单的事,而是保留我的内部头(最终也会出现在http调用btw中)。
你可以在你的内部文件前面加上
Camel
以避免它们作为http头泄漏。如果需要其中一些作为http头,可以在调用之前手动将其Map到另一个键。在这种情况下,我不确定是否需要手动添加http所需的头(如用户代理)。
你不需要它们。
另外,头文件的另一个常见误用是,如果您进行了两个http调用,但忘记清除头文件,则第一个调用的输出头文件将成为第一个调用的输入头文件。
在这种情况下,您至少应该删除带有
.removeHeaders("CamelHttp*)
.