当前位置: 首页 > 面试题库 >

使用Apache Commons HttpClient时如何覆盖请求中的“ Host”标头

沙海
2023-03-14
问题内容

我正在使用Jakarta Commons HttpClient
3.1编写一个负载测试工具,该工具需要针对不同的服务器,并假装它针对了HTTP服务器中的正确虚拟主机。为此,我需要能够将请求中的“主机”
HTTP标头设置为与我要连接的实际主机名不同的主机名。

似乎很明显,我应该使用Method.setRequestHeader("Host","fakehostname"),但是HttpClient只是忽略了这一点,并且总是在“主机”标头中发送我要连接的真实主机名(我为“
httpclient.wire”启用了调试日志记录,我可以做到这一点具体来说)。

如何覆盖标头,以便HttpClient注意?


问题答案:

在搜索了更多内容之后,并从Oleg的答案中得到了提示,我找到了HttpMethodParams ::
setVirtualHost()方法

当HttpClient格式化请求时,它总是在发送请求之前就自己创建“主机”标头-
因此不能将其作为标准标头覆盖。但是在从URL生成“主机”标头的主机名之前,HttpClient检查HttpMethodParams对象以查看用户是否要覆盖主机名。这仅覆盖主机名,而不覆盖端口,因此虽然不如我希望的直观,但使用起来更容易。

使用它的代码如下所示:

Method m = new GetMethod("http://some-site/some/path");
m.getParams().setVirtualHost("some-other-site");
client.executeMethod(m);

因为我喜欢一种衬垫,所以也可以写成:

client.executeMethod(new GetMethod("http://some-site/some/path") {{
    getParams().setVirtualHost("some-other-site"); }});


 类似资料:
  • 问题内容: 我的代码如下: 但是,当我使用tcpdump登录传出程序包时,http头“主机”为1.0.0.25。 可能是在发送过程的稍后阶段覆盖了HTTP标头“主机”,如果可以的话,如何避免这种行为。 问题答案: 最后一条评论解决了我的问题: 或在VM启动时:

  • 问题内容: 我正在使用maven-jetty-plugin并尝试使用-Djetty.port = 8090覆盖我的jetty.xml设置,但是它不起作用。仅当我从jetty.xml文件中删除连接器部件时,端口才是8090。 所以: 随着连接器在端口8080中启动 如果没有在端口8090中启动连接器 问题是我需要配置接受器,统计信息和其他内容。我尝试仅从连接器中删除端口,但是没有用。 我正在使用:

  • 我正在使用thuncydides jbehave插件来运行Selenium测试。但是,由于 jbehave 超时,我总共无法运行超过 5 分钟的测试。我不知道如何配置thuncydides/jbehave来覆盖这个限制。硒测试过去比5分钟更长,所以这对许多人来说应该是一个实际问题。

  • 我正在尝试连接到外部web套接字服务器,该服务器不是我自己运行的。我想从localhost javascript文件连接到它,因此origin头的值为null。 我知道这是一项打击跨网站伪造的措施。然而,因为我在localhost,我应该能够伪造这一点,通过让Chrome发送自定义的Origin标头。 可能吗?(如果我需要延期,可以) 如果没有,实现上述目标的最佳选择是什么?谢谢你。

  • 问题内容: 我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。 在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组…有人可以指出执行此操作的示例吗? 问题答案: 看看这个带注释的源示例,在该示例中,它们被本地存储替代项覆盖 基本上,Backbone.sync应该是一个

  • 我正在构建一个Java的grpc服务器,我很难得到请求头。proto文件是使用Pro buf-maven-plugin编译的,基于生成的存根,我无法访问上下文或请求元数据。 我还尝试在消息请求中定义一个键/值列表,希望grpc能够处理头映射,但目前为止没有成功。 知道我怎么能拿到标题吗? 谢谢 我的原型文件内容: 服务器端实现如下所示: 版本请求。getHeadersCount()始终返回0,尽管