簡體   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