RequestIdFilter.kt
package com.example.templateproject.web.configuration.filter
import jakarta.servlet.FilterChain
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.slf4j.MDC
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
import org.springframework.web.filter.OncePerRequestFilter
import java.util.UUID
@Component
@ConditionalOnProperty(name = ["management.tracing.export.enabled"], havingValue = "false")
@Order(0)
class RequestIdFilter : OncePerRequestFilter() {
companion object {
const val REQUEST_ID_HEADER = "X-Request-ID"
const val REQUEST_ID_MDC_KEY = "requestId"
}
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
chain: FilterChain,
) {
if (isValidRequestPath(request.requestURI)) {
var requestId = request.getHeader(REQUEST_ID_HEADER)
if (requestId.isNullOrEmpty()) {
requestId = UUID.randomUUID().toString()
}
MDC.put(REQUEST_ID_MDC_KEY, requestId)
response.setHeader(REQUEST_ID_HEADER, requestId)
try {
chain.doFilter(request, response)
} finally {
MDC.remove(REQUEST_ID_MDC_KEY)
}
} else {
chain.doFilter(request, response)
}
}
}