[英]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.