generated from 2martens/template-service
86 lines
2.5 KiB
Java
86 lines
2.5 KiB
Java
package de.twomartens.oparlservice.interceptors;
|
|
|
|
import lombok.NoArgsConstructor;
|
|
import org.slf4j.MDC;
|
|
import org.springframework.http.HttpRequest;
|
|
import org.springframework.http.client.ClientHttpRequestExecution;
|
|
import org.springframework.http.client.ClientHttpRequestInterceptor;
|
|
import org.springframework.http.client.ClientHttpResponse;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.io.IOException;
|
|
import java.util.UUID;
|
|
|
|
@Component
|
|
@NoArgsConstructor
|
|
public class TraceIdInterceptor extends HandlerInterceptorAdapter
|
|
implements ClientHttpRequestInterceptor {
|
|
|
|
private static final String LOGGER_TRACE_ID = "TraceID";
|
|
private static final String HEADER_FIELD_TRACE_ID = "X-TraceId";
|
|
|
|
/**
|
|
* Gets the TraceId from the MDC or create a new one and put it to the MDC
|
|
*/
|
|
public String getTraceId() {
|
|
String traceId = MDC.get(LOGGER_TRACE_ID);
|
|
if (traceId == null || traceId.trim().isEmpty()) {
|
|
traceId = UUID.randomUUID().toString();
|
|
MDC.put(LOGGER_TRACE_ID, traceId);
|
|
}
|
|
return traceId;
|
|
}
|
|
|
|
|
|
/**
|
|
* A failsafe method to set a TraceId to the MDC.
|
|
*
|
|
* @param traceId should be a traceId, if it is null or empty a new one will be created.
|
|
*/
|
|
public void setOrCreateTraceId(String traceId) {
|
|
if (traceId == null || traceId.trim().isEmpty()) {
|
|
traceId = UUID.randomUUID().toString();
|
|
}
|
|
MDC.put(LOGGER_TRACE_ID, traceId);
|
|
}
|
|
|
|
/**
|
|
* Removes the traceId from the MDC.
|
|
*/
|
|
public void resetTraceId() {
|
|
MDC.remove(LOGGER_TRACE_ID);
|
|
}
|
|
|
|
/**
|
|
* Creates a new traceId for this thread.
|
|
*
|
|
* An old one will be overwritten!
|
|
*/
|
|
public void createNewTraceId() {
|
|
resetTraceId();
|
|
getTraceId();
|
|
}
|
|
|
|
// client interceptor web
|
|
@Override
|
|
public ClientHttpResponse intercept(
|
|
HttpRequest request,
|
|
byte[] body,
|
|
ClientHttpRequestExecution execution) throws IOException {
|
|
request.getHeaders().add(HEADER_FIELD_TRACE_ID, getTraceId());
|
|
return execution.execute(request, body);
|
|
}
|
|
|
|
// server interceptor web
|
|
@Override
|
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
|
String traceId = request.getHeader(HEADER_FIELD_TRACE_ID);
|
|
setOrCreateTraceId(traceId);
|
|
response.addHeader(HEADER_FIELD_TRACE_ID, getTraceId());
|
|
return true;
|
|
}
|
|
}
|