[수미수의 개발 브로구]

[WebFlux] WebFlux Server Request 에 Custom Header 추가하기 본문

Language & Framework/WebFlux

[WebFlux] WebFlux Server Request 에 Custom Header 추가하기

수미수 2023. 9. 15. 23:06
반응형

WebFlux 를 사용하면서, 특정 비지니스로직에 의하거나 또는 다른 목적에 의해 요청된 Request 의 Http Header 에 Custom Header 를 추가해야 하는일일 발생 했다. 

아래 소스는 요청된 Request 값에 토큰의 값에서 추출한 고객 정보를 Request 의 Http Header 중 X_CHANNEL_CUSTOMER_ID Key에 설정 하는 예제 소스이다.

해당 로직을 통해서, ServerExchange 객체를 사용 할 수 있으면, 임의로 설정한 X_CHANNEL_CUSTOMER_ID 헤더 값을 가져 올 수 있게 된다.

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
@Order(3)
class ReactiveRequestContextFilter(private val tracer: Tracer) : WebFilter {

    /**
     * WebFilter
     */
    override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
        val headers = exchange.request.headers
        val traceId = traceIdAndSpanId.first
        val spanId = traceIdAndSpanId.second
        
        var mutateServerWebExchange: ServerWebExchange = exchange
        
        // Spring Security 를 통해서 토큰 값의 정보를 추출 한다.
        return ReactiveSecurityContextHolder.getContext()
            .map {
                ClientUtil.getCustomerIdFromToken(it)
            }.doOnNext {
                // custId 나온 값을 custom Header 로 생성하여 셋팅 한다.
                val customerId = it
                val mutateRequest: ServerHttpRequest = exchange.request.mutate()
                    .header(X_CHANNEL_CUSTOMER_ID, customerId)
                    .build()
                // serverWebExchange 객체를 신규로 생성 한다.
                mutateServerWebExchange = exchange.mutate().request(mutateRequest).build()
            }
            .then(chain.filter(mutateServerWebExchange))
    }
}

 

반응형