如何解决Camel-Jetty发送含双Bearer Token请求时请求头过大问题
问题
使用Camel-Jetty发送包含两个Bearer Token请求头的HTTP GET请求时,抛出Request header too large错误,单独携带任意一个请求头则请求正常。尝试创建独立JettyHttpComponent9并设置RequestHeaderSize和RequestBufferSize未解决问题,目前临时改用camel-http4组件。
报错日志
org.apache.camel.CamelExchangeException: JettyClient failed cause by: 500: Request header too large. Exchange[ID-BE1HL631-1658772224692-0-1]. Caused by: [org.eclipse.jetty.http.BadMessageException - 500: Request header too large] at org.apache.camel.component.jetty9.JettyContentExchange9.doTaskCompleted(JettyContentExchange9.java:162) ~[camel-jetty9-2.22.2.jar:2.22.2] at org.apache.camel.component.jetty9.JettyContentExchange9.onConnectionFailed(JettyContentExchange9.java:128) ~[camel-jetty9-2.22.2.jar:2.22.2] at org.apache.camel.component.jetty9.JettyContentExchange9$1.onFailure(JettyContentExchange9.java:223) ~[camel-jetty9-2.22.2.jar:2.22.2] at org.eclipse.jetty.client.RequestNotifier.notifyFailure(RequestNotifier.java:253) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.RequestNotifier.notifyFailure(RequestNotifier.java:239) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpSender.abort(HttpSender.java:567) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpSender.lambda$executeAbort$0(HttpSender.java:361) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) ~[jetty-util-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) ~[jetty-util-9.4.44.v20210927.jar:9.4.44.v20210927] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] Caused by: org.eclipse.jetty.http.BadMessageException: 500: Request header too large at org.eclipse.jetty.client.http.HttpSenderOverHTTP$HeadersCallback.process(HttpSenderOverHTTP.java:235) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241) ~[jetty-util-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:223) ~[jetty-util-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.http.HttpSenderOverHTTP.sendHeaders(HttpSenderOverHTTP.java:65) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpSender.send(HttpSender.java:212) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.http.HttpChannelOverHTTP.send(HttpChannelOverHTTP.java:84) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpChannel.send(HttpChannel.java:125) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpConnection.send(HttpConnection.java:241) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.http.HttpConnectionOverHTTP$Delegate.send(HttpConnectionOverHTTP.java:269) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.send(HttpConnectionOverHTTP.java:125) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.http.HttpDestinationOverHTTP.send(HttpDestinationOverHTTP.java:38) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpDestination.process(HttpDestination.java:377) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpDestination.process(HttpDestination.java:332) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpDestination.send(HttpDestination.java:311) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.HttpDestination.succeeded(HttpDestination.java:246) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.AbstractConnectionPool.proceed(AbstractConnectionPool.java:319) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.AbstractConnectionPool$FutureConnection.succeeded(AbstractConnectionPool.java:539) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.AbstractConnectionPool$FutureConnection.succeeded(AbstractConnectionPool.java:517) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.util.Promise$Wrapper.succeeded(Promise.java:130) ~[jetty-util-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onOpen(HttpConnectionOverHTTP.java:133) ~[jetty-client-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.io.SelectorManager.connectionOpened(SelectorManager.java:324) ~[jetty-io-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.io.ManagedSelector.createEndPoint(ManagedSelector.java:402) ~[jetty-io-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.io.ManagedSelector.access$2100(ManagedSelector.java:65) ~[jetty-io-9.4.44.v20210927.jar:9.4.44.v20210927] at org.eclipse.jetty.io.ManagedSelector$CreateEndPoint.run(ManagedSelector.java:1069) ~[jetty-io-9.4.44.v20210927.jar:9.4.44.v20210927] ... 3 common frames omitted
解决方案
1. 正确配置Jetty客户端请求头大小限制
你之前设置的RequestHeaderSize和RequestBufferSize是Jetty服务端的配置参数,作为客户端需要调整客户端的请求头大小限制,对应的参数是maxRequestHeaderSize。
Java代码配置方式:
// 创建Jetty组件 JettyHttpComponent9 jettyComponent = new JettyHttpComponent9(); // 创建客户端配置 JettyHttpClientConfiguration clientConfig = new JettyHttpClientConfiguration(); // 设置更大的请求头大小,比如64KB(根据Token总大小调整) clientConfig.setMaxRequestHeaderSize(65536); // 关联配置到组件 jettyComponent.setHttpClientConfiguration(clientConfig); // 将组件添加到Camel上下文 camelContext.addComponent("jetty9", jettyComponent);
XML配置方式:
<!-- 定义Jetty客户端配置 --> <bean id="jettyHttpClientConfig" class="org.apache.camel.component.jetty9.JettyHttpClientConfiguration"> <property name="maxRequestHeaderSize" value="65536"/> </bean> <!-- 配置Jetty9组件 --> <bean id="jetty9" class="org.apache.camel.component.jetty9.JettyHttpComponent9"> <property name="httpClientConfiguration" ref="jettyHttpClientConfig"/> </bean>
2. 确认Token总大小
先计算两个Bearer Token的总字符数(加上Bearer 前缀),确保设置的maxRequestHeaderSize大于这个值(注意HTTP头还包含Host、User-Agent等默认头,需要留有余量)。
3. 临时方案验证
改用camel-http4组件是可行的,该组件默认请求头限制更大,配置逻辑也更直观,若不想调整Jetty配置可继续使用此方案。
内容的提问来源于stack exchange,提问作者Rainer Bonn
相关产品推荐
相关产品推荐

