ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

Spring Webfluxでのinterceptorメモ

本家はこちら

Spring WebfluxはServlet使えないのでInterceptorとかないらしい。

Spring WebfluxではWebFilterを使うらしいので、メモ。


import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import org.springframework.web.server.WebSession; import reactor.core.publisher.Mono; @Configuration @Component @Slf4j public class SampleWebFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { return chain.filter(exchange) .doOnRequest(value -> onRequest(exchange)) .doOnSuccess(done -> onSuccess()) .doOnSuccessOrError((success, error) -> onSuccessOrError()); } // controller前に呼ばれる private void onRequest(ServerWebExchange exchange) { log.info("{}", exchange); Mono<WebSession> session = exchange.getSession(); log.info("{}", session); SecurityContext context = SecurityContextHolder.getContext(); log.info("{}", context); log.info("onRequest"); } // exception発生しないときに呼ばれる private void onSuccess() { log.info("onSuccess"); } // exception発生しないときに呼ばれる private void onError() { log.info("onError"); } // 成功でもエラーでも呼ばれる private void onSuccessOrError() { log.info("onSuccessOrError"); } }

リクエストの中身もとれるのだが、thread localを使わないほうがいいらしいので、そこで処理したものはどうしたらいいんだろ...

doOnEach()doOnSuccessOrError() の違いはまだわかってないw