如何在Camel中的HTTP重定向过程中过滤掉报头?

ut6juiuv  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(171)

在我的Camel SpringBoot应用程序中,我发送了一个请求(其中包括一些特定的HTTP头),并从远程服务接收到了302。Camel会自动跟随重定向,但会包括之前设置的所有头,这会在另一端造成一些问题。有什么方法可以控制这种行为吗?

osh3o9ms

osh3o9ms1#

最明显的是使用以下命令删除Camel路由中的特定头

.removeHeaders("Camel*")

当然,这必须对每个报头模式进行,如果您有多个出站连接,还必须多次进行。
但是Camel也有HeaderFilterStrategy概念。大多数组件都有默认使用的默认实现。
对于HTTP,这是HttpHeaderFilterStrategy。它适用于所有HTTP连接,并过滤以下标头:

  • 内容长度
  • 内容类型
  • 宿主
  • 高速缓存控制
  • 连接
  • 日期
  • 编译指示
  • 拖车
  • 传输编码
  • 升级
  • 通孔
  • 警告
  • 驼色 *
  • apache.camel* 的数据库

您可以自由地**实现您自己的自定义HeaderFilterStrategy**或扩展Camel之一。然后,您可以将其注册为Spring bean,并配置您的端点在需要时使用它。

.to("http:myEndpoint?&headerFilterStrategy=#myHeaderFilter") // myHeaderFilter = name of the Spring bean
aiqt4smr

aiqt4smr2#

我能够通过创建一个自定义HTTP配置器来解决这个问题,该配置器向请求添加一个拦截器,例如。

public class RedirectHttpClientConfigurer implements HttpClientConfigurer {

    @Override
    public void configureHttpClient(HttpClientBuilder clientBuilder) {
        clientBuilder.addInterceptorFirst(new RedirectInterceptor());
    }

    public class RedirectInterceptor implements HttpRequestInterceptor {

        @Override
        public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
            Object httpResponseContextAttr = context.getAttribute("http.response");
            if (httpResponseContextAttr != null) {
                HttpResponse httpResponse = (HttpResponse) httpResponseContextAttr;
                int statusCode = httpResponse.getStatusLine().getStatusCode();
                if (statusCode > 299 && statusCode < 399) {
                    request.removeHeaders("Authorization");
                }
            }
        }
    }
}

然后我将其配置为bean:

<spring:bean id="redirectConfigurer" class="com.foo.bar.RedirectHttpClientConfigurer"/>

并在端点中引用它:

<to uri="http://com.foo.bar?httpClientConfigurer=#redirectConfigurer"/>

相关问题