[英]Spring-boot webflux: add response time headers in webfilter
嗨,我有以下网络过滤器
@Component
public class TMPFilter implements WebFilter {
private long requestTime = System.nanoTime();
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
long deltaTime = System.nanoTime() - requestTime;
exchange.getResponse().getHeaders().add("server-timing-test", "test");
System.out.println(deltaTime);
return chain.filter(exchange)
.doOnRequest(request -> {
requestTime = System.nanoTime();
})
.doOnSuccess( arg -> {
long delta = System.nanoTime() - requestTime;
exchange.getResponse().getHeaders().add("server-timing-success", Long.toString(delta));
})
.doOnError((arg) -> {
long delta = System.nanoTime() - requestTime;
exchange.getResponse().getHeaders().add("server-timing-error", Long.toString(delta));
})
.doFinally((arg) -> {
long delta = System.nanoTime() - requestTime;
exchange.getResponse().getHeaders().add("server-timing-finally", Long.toString(delta));
});
}
}
我想发回一个带有标题的响应,其中包含解决该响应所需的时间。 我不知道该怎么做,我收到以下错误。
java.lang.UnsupportedOperationException: null
at org.springframework.http.ReadOnlyHttpHeaders.add(ReadOnlyHttpHeaders.java:91)
Suppressed: java.lang.UnsupportedOperationException: null
at org.springframework.http.ReadOnlyHttpHeaders.add(ReadOnlyHttpHeaders.java:91)
at com...tmp.api.filters.TMPFilter.lambda$filter$1(TMPFilter.java:28)
这似乎可以解决问题:
import org.apache.commons.lang3.time.StopWatch;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import java.util.concurrent.TimeUnit;
@Component
public class TMPFilter implements WebFilter {
private StopWatch stopWatch = new StopWatch();
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpResponse response = exchange.getResponse();
startWatch();
response.beforeCommit(() -> {
stopWatch();
String duration = Long.toString(stopWatch.getTime(TimeUnit.MILLISECONDS));
response.getHeaders().add("server-timing-total", duration);
return Mono.empty();
});
return chain.filter(exchange)
.doOnRequest(request -> {
startWatch();
});
}
private void startWatch() {
if(this.stopWatch.isStopped()) {
this.stopWatch.start();
}
}
private void stopWatch() {
if(this.stopWatch.isStarted()) {
this.stopWatch.stop();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.