6 votes

Comment implémenter/migrer OncePerRequestFilter en utilisant Spring webflux ?

En utilisant Spring web, un simple OncePerRequestFilter (voir ci-dessous) peuvent conserver un identifiant de demande pendant toute la durée de la demande. Stocker l'identifiant de la demande généré dans un attribut de la demande, l'ajouter au MDC de journalisation et le renvoyer dans un en-tête de réponse.

Je comprends que la pile webflux réactive est complètement différente, alors comment aborder cette question ?

J'ai trouvé https://github.com/spring-projects/spring-framework/issues/20239 mais il n'est pas clair ce qui est maintenant supporté ou non.

@Component
public class RequestIdFilter extends OncePerRequestFilter implements Ordered {

    private static final String MDC_KEY = "requestId";
    private static final String REQUEST_ATTRIBUTE_NAME = "requestId";
    private static final String RESPONSE_HEADER_NAME = "X-Request-Id";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        var requestId = UUID.randomUUID().toString();
        MDC.put(MDC_KEY, requestId);
        request.setAttribute(REQUEST_ATTRIBUTE_NAME, requestId);
        response.setHeader(RESPONSE_HEADER_NAME, requestId);
        try {
            filterChain.doFilter(request, response);
        } finally {
            MDC.remove(MDC_KEY);
        }
    }

    @Override
    public int getOrder() {
        return requestIdProperties.getServerFilterOrder();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X