ApacheCamel向http调用发送内部头

k10s72fa  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(395)

默认情况下,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调用,但忘记清除头文件,则第一个调用的输出头文件将成为第一个调用的输入头文件。
有人找到一个很好的解决方法来避免这个问题吗?

mm5n2pyu

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*) .

相关问题