programing

SpringBoot WebClient를 사용할 때 요청을 가로채기

starjava 2023. 7. 21. 20:25
반응형

SpringBoot WebClient를 사용할 때 요청을 가로채기

사용하려고 합니다.WebClient휴게소에 연락해 주세요이전 이야기RestTemplate우리는 있었습니다.ClientHttpRequestInterceptor정의되고 부착된RestTemplate요청을 가로채고 수정합니다.와 함께WebClient같은 방법이 있습니까?

감사해요.

-Screeni

WebClient Builder를 사용하는 경우 의 구현을 전달할 수 있습니다.ExchangeFilterFunction를 사용한 인터페이스filter()방법.이것은 다음과 같습니다.ClientHttpRequestInterceptor위해서RestTemplate.

WebClient Builder 문서: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.Builder.html#filter-org.springframework.web.reactive.function.client.ExchangeFilterFunction-

ExchangeFilter 함수 문서: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/reactive/function/client/ExchangeFilterFunction.html

예:

WebClient webClient = WebClient.builder()
        .baseUrl("http://localhost:8080|)
        .filter(logFilter())
        .build();


private ExchangeFilterFunction logFilter() {
    return (clientRequest, next) -> {
        logger.info("External Request to {}", clientRequest.url());
        return next.exchange(clientRequest);
    };
}

저의 경우 수신 요청에서 일부 헤더를 가져와 요청에 넣어야 합니다.제가 필요한 것은 여기 있습니다.

우선 필터가 필요합니다.

/**
 * ReactiveRequestContextFilter
 *
 * @author L.cm
 */
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRequestContextFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        return chain.filter(exchange)
        .subscriberContext(ctx -> ctx.put(ReactiveRequestContextHolder.CONTEXT_KEY, request));
    }
}

그리고.ReactiveRequestContextHolder

/**
 * ReactiveRequestContextHolder
 *
 * @author L.cm
 */
public class ReactiveRequestContextHolder {
    static final Class<ServerHttpRequest> CONTEXT_KEY = ServerHttpRequest.class;

    /**
     * Gets the {@code Mono<ServerHttpRequest>} from Reactor {@link Context}
     * @return the {@code Mono<ServerHttpRequest>}
     */
    public static Mono<ServerHttpRequest> getRequest() {
        return Mono.subscriberContext()
            .map(ctx -> ctx.get(CONTEXT_KEY));
    }

}

마지막으로 Michael McFadyen이 말한 것처럼 당신은 다음과 같은 구성이 필요합니다.ExchangeFilterFunction나의 경우 Auth와 origin이 필요합니다.

private ExchangeFilterFunction headerFilter() {
    return (request, next) -> ReactiveRequestContextHolder.getRequest()
            .flatMap(r -> {
                ClientRequest clientRequest = ClientRequest.from(request)
                        .headers(headers -> {
                            headers.set(HttpHeaders.ORIGIN, r.getHeaders().getFirst(HttpHeaders.ORIGIN));
                            headers.set(HttpHeaders.AUTHORIZATION, r.getHeaders().getFirst(HttpHeaders.AUTHORIZATION));
                        })
                        .build();
                return next.exchange(clientRequest);
            });
}

사용할 수 있습니다.ExchangeFilterFunction에서 구성합니다.WebClient사용 중인 인스턴스입니다.자세한 내용은 Spring Framework 참조 문서를 참조하십시오.

언급URL : https://stackoverflow.com/questions/51726943/how-to-intercept-a-request-when-using-springboot-webclient

반응형