繁体   English   中英

Spring-boot webflux:在 webfilter 中添加响应时间标头

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM