如何解决如何使用 Spring-boot-admin 服务器覆盖 Host 标头
当管理服务器访问执行器端点时,我需要向客户端应用程序发送一个特定的主机值。例如,我希望能够通过管理服务器发出以下 curl 请求。
curl -H "Host: discovery-headless" 10.0.10.2:9080/actuator/metrics
我尝试添加以下 HttpHeadersProvider
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return (instance) -> {
HttpHeaders httpHeaders = new HttpHeaders();
String serviceName = instance.getRegistration().getName();
String host = serviceName.contains("headless") ? serviceName : serviceName + "-headless";
httpHeaders.add("Host",host);
return httpHeaders;
};
}
并且我可以看到请求中存在标头,但正在注册的端点的网址中也有无头。
endpoints=Endpoints(endpoints={caches=Endpoint(id=caches,url=http://discovery-headless/actuator/caches),loggers=Endpoint(id=loggers,url=http://discovery-headless/actuator/loggers),logfile=Endpoint(id=logfile,url=http://discovery-headless/actuator/logfile),
我还尝试在不使用 HttpHeadersProvider 的情况下向 webclient 添加过滤器,但我看到了相同的结果。端点的 url 中都有被覆盖的主机。
@Override
public void customize(Builder webClientBuilder) {
webClientBuilder.filter(addHeadlessHeader());
}
private ExchangeFilterFunction addHeadlessHeader() {
return (clientRequest,next) -> {
Map<String,String> updatedHeaders = new HashMap<>();
clientRequest.headers().forEach((key,values) -> {
for (String value : values) {
updatedHeaders.put(key,value);
}
});
String hostHeader = updatedHeaders.get(HttpHeaders.HOST);
if(hostHeader == null || (hostHeader != null && !hostHeader.contains("headless"))) {
Instance service = (Instance) clientRequest.attribute("instance").get();
if(service != null) {
String serviceName = service.getRegistration().getName();
hostHeader = serviceName + "-headless";
updatedHeaders.put(HttpHeaders.HOST,hostHeader);
}
}
ClientRequest updatedRequest = ClientRequest.from(clientRequest)
.headers(headers -> headers.setAll(updatedHeaders))
.build();
return next.exchange(updatedRequest);
};
}
向客户端实例发出请求时覆盖 Host 标头的正确方法是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。