当前位置: 首页 > 知识库问答 >
问题:

使用camel作为代理,在更改URI标头时获得“连接重置”

濮阳振
2023-03-14

我非常感谢在这个问题上的任何帮助。我使用Camel作为代理,并使用路由上的处理器将http请求和响应记录到数据库中。

这是我的路线:

final String proxyEndpoint = https4://targetServler?bridgeEndpoint=true&throwExceptionOnFailure=false;

            onException(Exception.class).handled(false).process(exceptionHandlingProcessor)
                    .id(exceptionHandlingProcessor.getId());

            from("servlet://?matchOnUriPrefix=true")//
                    .setExchangePattern(ExchangePattern.InOut)//
                    .routeId("proxy-route")//
                    .choice()//
                        .when(header(Exchange.HTTP_PATH)//
                            .regex("^(\\/?static\\/.*|favicon.ico)$"))//
                            .to(proxyEndpoint)//
                        .otherwise()//
                            .process(validationProcessor).id(validationProcessor.getId())//
                            .process(logRequestProcessor).id(logRequestProcessor.getId())//
                            .to(proxyEndpoint)//
                            .convertBodyTo(String.class)// 
                            .process(logResponseProcessor).id(logResponseProcessor.getId());

这可以工作并路由每个请求,并且任何非静态资源都记录到数据库(在处理器内部完成)。

然后我需要DB中其他请求/其他表的第二条路由,但这次必须更改URI(从DB中读取)。所以我补充道:

from("servlet://?matchOnUriPrefix=true&servletName=AnotherCamelServlet")
                    .setExchangePattern(ExchangePattern.InOut)//
                    .routeId("second-route")//
                    .process(handleRequestForSecondRouteProcessor)//
                    .id(handleRequestForSecondRouteProcessor.getId())//
                    .to("https4://dummyuri")//
                    .convertBodyTo(String.class)//
                    .process(logResponseForSecondRouteProcessor).id(logResponseForSecondRouteProcessor.getId());

在handleRequestForSecondRouteProcessor中,我添加了uri头的替换:

inMessage.setHeader(Exchange.HTTP_URI, newUriFromDatabase
                + "?bridgeEndpoint=true&throwExceptionOnFailure=false"); // not sure if needed

但是每次我调用第二个路由时,都会发生连接重置。(顺便说一句,如果我调用第一个路由(有效),然后按F5,同样的问题会发生)。

我很欣赏每一个想法,因为我在这个话题上已经好几天了。如果需要更多信息,请发表评论。谢谢!

共有1个答案

吴安和
2023-03-14

当您收到第一个请求时,会有很多标头包含与该请求相关的信息。其中一些标头很可能会干扰您的下一个请求。在调用第二个路由之前尝试删除所有标头,看看是否有帮助,然后您可以从那里继续并尝试删除必要的标头。

.removeHeaders("*")
 类似资料:
  • 我目前有两个MQTT代理,它们都工作得很好。其中一个是我本地网络上的覆盆子派。另一个是托管在CloudMQTT上的远程代理。 目标是使两个代理彼此同步。当然,简单的解决方案是桥,但我遇到了一些困难,得到一个适当的桥设置。 据我所知,只有当你有一个静态IP和端口转发到Raspberry Pi时,你才能连接到你的本地网络,那么我如何才能绕过这个问题呢?两个代理需要保持一个永久的TCP连接打开,但是远程

  • 我正在用Cordova和Ionic编写一个混合应用程序。我的问题是,我想通过http请求访问服务器,我需要更改设备的用户代理来传递密钥。 但当我查看服务器的日志时,用户代理没有改变: “GET /service HTTP/1.1” - “Mozilla/5.0 (Macintosh;Intel Mac OS X 10_10_1) AppleWebKit (KHTML, like Gecko) Ch

  • 我的hql查询似乎有什么问题? 错误: 组织。冬眠hql。内部的ast。QuerySyntaxException:意外标记:第1行第263列附近的标记 我假设它是在谈论

  • 问题内容: 我无法正确设置https连接的属性。根据我的收集,可以通过VM选项或通过设置http- header属性。但是,通过VM选项设置用户代理会导致将Java / [version]附加到http.agent的值之后。同时,仅适用于http连接,不适用于https(至少在我尝试时)。 我已经通过使用WireShark检查http通讯来发现/验证了问题。有没有办法解决? 更新:附加信息 看来我

  • 我一直在工作的Apache骆驼连接https URLS'通过提供TLS证书通过代理,但得到错误org.apache.http.conn.不支持的模式异常:超文本传输协议不支持 下面是驼峰路由和带有代理的ssl上下文 公共类HttpProxyRouter扩展了RouteBuilder{ } 遇到错误 org.apache.catalina.core.Application Context logIN

  • 这是我之前的问题:如果一些注入的属性发生了变化,请重新注入CDI bean 同样,我使用的是CDI(焊缝),而不是Spring IoC,所以我不能使用Spring cloud config中的,但我认为我期望的功能可以与使用自定义范围类似。