本家はこちら
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