RequestIdFilter.java

package uk.gov.dhsc.htbhf.requestcontext;

import lombok.RequiredArgsConstructor;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;
import java.util.UUID;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import static org.springframework.util.StringUtils.isEmpty;
import static uk.gov.dhsc.htbhf.requestcontext.MDCWrapper.REQUEST_ID_MDC_KEY;
import static uk.gov.dhsc.htbhf.requestcontext.MDCWrapper.SESSION_ID_MDC_KEY;

/**
 * Filter to be used on incoming requests to add request id and session id to the MDC
 * for logging.
 */
@RequiredArgsConstructor
public class RequestIdFilter extends OncePerRequestFilter {

    /**
     * The name of the request id header.
     */
    public static final String REQUEST_ID_HEADER = "X-REQUEST-ID";

    /**
     * The name of the session id header.
     */
    public static final String SESSION_ID_HEADER = "X-SESSION-ID";

    private final RequestContextHolder requestContextHolder;
    private final MDCWrapper mdcWrapper;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            String requestId = request.getHeader(REQUEST_ID_HEADER);
            if (isEmpty(requestId)) {
                requestId = UUID.randomUUID().toString();
            }
            mdcWrapper.put(REQUEST_ID_MDC_KEY, requestId);
            RequestContext requestContext = requestContextHolder.get();
            requestContext.setRequestId(requestId);

            String sessionId = request.getHeader(SESSION_ID_HEADER);
            mdcWrapper.put(SESSION_ID_MDC_KEY, sessionId);
            requestContext.setSessionId(sessionId);

            requestContext.setMethod(request.getMethod());
            requestContext.setServletPath(request.getServletPath());

            filterChain.doFilter(request, response);
        } finally {
            mdcWrapper.clear();
            requestContextHolder.clear();
        }

    }
}