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
'programing' 카테고리의 다른 글
mvn spring-boot에서 시작한 프로그램에 JVM 옵션을 추가하는 방법:run (0) | 2023.07.21 |
---|---|
열에서 대문자 단어를 찾는 SQL (0) | 2023.07.21 |
구성에서 유형을 정의하는 것을 고려합니다. (0) | 2023.07.21 |
Spring Rest 컨트롤러 상속 (0) | 2023.07.21 |
ASP.NET Development Server 대신 IIS에 디버거를 연결하려면 어떻게 해야 합니까? (0) | 2023.07.16 |