From ecc20f9566c0ec766957693a1ab74cc5182a8682 Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Thu, 15 Nov 2018 00:48:32 +0900 Subject: [PATCH] Support the version 4 uuid string on XTrackMDCPutFilter #808 --- .../web/logging/mdc/XTrackMDCPutFilter.java | 77 ++++++++++++++++--- .../logging/mdc/XTrackMDCPutFilterTest.java | 34 ++++++++ 2 files changed, 102 insertions(+), 9 deletions(-) diff --git a/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/main/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilter.java b/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/main/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilter.java index c614279c5..3d1a78823 100644 --- a/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/main/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilter.java +++ b/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/main/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilter.java @@ -22,22 +22,39 @@ import javax.servlet.http.HttpServletResponse; /** - * Set random value per request to MDC and HTTP Response Header and HTTP Request Attribute (request scope).
+ * Set random value(track ID) per request to MDC and HTTP Response Header and HTTP Request Attribute (request scope).
*

- * default attribute name is "X-Track". You can change this name by configure. The value of X-Track is retrieved from HTTP - * Request Header (same attribute name).
- * If the attibute is not set in HTTP Request Header, this filter creates random value as X-Track and use it. - * + * The value of track ID is retrieved from HTTP Request Header.
+ * If the attribute is not set in HTTP Request Header, this filter creates random value as track ID and use it. + * + *

+ * An attribute name of track ID is "X-Track" by default. + * Also you can change to an any name as follow: + * *

+ * in web.xml
  * 
  * <init-param>
  *     <param-name>attributeName</param-name>
- *     <param-value>XXXX</param-value>
+ *     <param-value>Tracking-Id</param-value>
  * </init-param>
  * 
  * 
- * + * + *

+ * A random value is the 32 length HEX string(trimmed the '-' character from version 4 uuid string) by default. + * Also you can change to use a version 4 uuid string(not trimmed the '-' character) as follow: + * + *

  * in web.xml
+ * 
+ * <init-param>
+ *     <param-name>useV4Uuid</param-name>
+ *     <param-value>true</param-value>
+ * </init-param>
+ * 
+ * 
+ * */ public class XTrackMDCPutFilter extends AbstractMDCPutFilter { @@ -51,6 +68,16 @@ public class XTrackMDCPutFilter extends AbstractMDCPutFilter { */ private String attributeName = "X-Track"; + /** + * Whether use the version 4 uuid string when a track ID will create + */ + private boolean useV4Uuid; + + /** + * Whether there was specified the {@code maxMDCValueLength} by user + */ + private boolean specifiedMaxMDCValueLength; + /** * set attribute name to set MDC and HTTP Response Header
* @param attributeName attribute name @@ -59,6 +86,37 @@ public void setAttributeName(String attributeName) { this.attributeName = attributeName; } + /** + * set whether use the version 4 uuid string when a track ID will create. + *

+ * Default is {@code false}. + *

+ * @param useV4Uuid If use the version 4 uuid string, set to {@code true} + */ + public void setUseV4Uuid(boolean useV4Uuid) { + this.useV4Uuid = useV4Uuid; + } + + /** + * {@inheritDoc} + */ + @Override + public void setMaxMDCValueLength(int maxMDCValueLength) { + super.setMaxMDCValueLength(maxMDCValueLength); + this.specifiedMaxMDCValueLength = true; + } + + /** + * If the {@code useV4Uuid} is {@code true} and the {@code maxMDCValueLength } not present, + * set the {@code maxMDCValueLength} to {@code 36}(length of version 4 uuid string). + */ + @Override + protected void initFilterBean() { + if (!specifiedMaxMDCValueLength && useV4Uuid) { + setMaxMDCValueLength(36); + } + } + /** *

* get attribute name to set MDC and HTTP Response Header. (default: X-Track) @@ -75,13 +133,14 @@ protected String getMDCKey(HttpServletRequest request, /** * Create track ID (X-Track)
*

- * returns 32-length random HEX string. + * returns 32-length random HEX string or version 4 uuid string. *

* @return X-Track */ protected String createXTrack() { String uuid = UUID.randomUUID().toString(); - String xTrack = UUID_REPLACE_PATTERN.matcher(uuid).replaceAll(""); + String xTrack = useV4Uuid ? uuid + : UUID_REPLACE_PATTERN.matcher(uuid).replaceAll(""); return xTrack; } diff --git a/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/test/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilterTest.java b/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/test/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilterTest.java index 123e40977..dfcede62c 100644 --- a/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/test/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilterTest.java +++ b/terasoluna-gfw-common-libraries/terasoluna-gfw-web/src/test/java/org/terasoluna/gfw/web/logging/mdc/XTrackMDCPutFilterTest.java @@ -124,4 +124,38 @@ public void testGetMDCValue_default_attributeName_set_in_http_request_too_long_l assertThat((String) request.getAttribute("X-Track"), is( "12345678901234567890123456789012")); } + + @Test + public void testGetMDCValue_useV4Uuid() throws ServletException { + mockFilterConfig.addInitParameter("useV4Uuid", "true"); + xTrackMDCPutFilter.init(mockFilterConfig); + MockHttpServletRequest request = new MockHttpServletRequest(); + MockHttpServletResponse response = new MockHttpServletResponse(); + + String xTrack = xTrackMDCPutFilter.getMDCValue(request, response); + assertThat(xTrack, is(notNullValue())); + assertThat(xTrack.matches( + "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"), + is(true)); + assertThat(response.getHeader("X-Track"), is(xTrack)); + assertThat((String) request.getAttribute("X-Track"), is(xTrack)); + } + + @Test + public void testGetMDCValue_useV4Uuid_when_specified_maxMDCValueLength() throws ServletException { + mockFilterConfig.addInitParameter("useV4Uuid", "true"); + mockFilterConfig.addInitParameter("maxMDCValueLength", "39"); + xTrackMDCPutFilter.init(mockFilterConfig); + MockHttpServletRequest request = new MockHttpServletRequest(); + MockHttpServletResponse response = new MockHttpServletResponse(); + + request.addHeader("X-Track", + "1234567890123456789012345678901234567890"); + + String xTrack = xTrackMDCPutFilter.getMDCValue(request, response); + assertThat(xTrack, is("123456789012345678901234567890123456789")); + assertThat(response.getHeader("X-Track"), is(xTrack)); + assertThat((String) request.getAttribute("X-Track"), is(xTrack)); + } + }