DebugHeaderFilter.kt

package com.example.templateproject.web.configuration.filter

import jakarta.servlet.Filter
import jakarta.servlet.FilterChain
import jakarta.servlet.ServletRequest
import jakarta.servlet.ServletResponse
import jakarta.servlet.http.HttpServletRequest
import org.slf4j.LoggerFactory
import org.slf4j.MDC
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component

@Component
@Order(1)
class DebugHeaderFilter : Filter {
    companion object {
        private val LOGGER = LoggerFactory.getLogger(DebugHeaderFilter::class.java)
        const val DEBUG_REQUEST_HEADER_NAME = "Jh7rLp2q9w4s8xv"
        const val DEBUG_REQUEST_HEADER_VALUE = "Gk3sFp7vRq9w2Lx"
        const val DEBUG_MODE_MDC_KEY = "debugLevel"
        const val DEBUG_MODE_MDC_VALUE = "on"
        const val TRACE_ID_MDC_KEY = "traceId"
    }

    override fun doFilter(
        request: ServletRequest,
        response: ServletResponse,
        chain: FilterChain,
    ) {
        if (request is HttpServletRequest && isValidRequestPath(request.requestURI)) {
            val debugHeader = request.getHeader(DEBUG_REQUEST_HEADER_NAME)

            if (!debugHeader.isNullOrEmpty() && debugHeader == DEBUG_REQUEST_HEADER_VALUE) {
                MDC.put(DEBUG_MODE_MDC_KEY, DEBUG_MODE_MDC_VALUE)

                val requestId = MDC.get(RequestIdFilter.REQUEST_ID_MDC_KEY)
                val traceId = MDC.get(TRACE_ID_MDC_KEY)

                LOGGER.debug(
                    "Debug level logging is turned on for {}: {}",
                    if (requestId.isNullOrEmpty()) TRACE_ID_MDC_KEY else RequestIdFilter.REQUEST_ID_MDC_KEY,
                    requestId ?: traceId,
                )
            }

            try {
                chain.doFilter(request, response)
            } finally {
                MDC.remove(DEBUG_MODE_MDC_KEY)
            }
        } else {
            chain.doFilter(request, response)
        }
    }
}